Хобрук: Ваш путь к мастерству в программировании

Как я могу загрузить файл внутри папки в Google Cloud Storage с помощью облачных функций?

Я использую функцию Google Cloud, запускаемую https, которая должна загружать файл из Google Cloud Storage (а затем объединять его с данными из req.body). Хотя кажется, что это работает, пока загруженный файл находится в корневом каталоге, у меня возникают проблемы с доступом к тому же файлу, когда он помещен в папку. Путь к файлу documents/someTemplate.docx

'use strict';
const functions = require('firebase-functions');
const path = require('path');
const os = require("os");
const fs = require('fs');
const gcconfig = {
  projectId: "MYPROJECTNAME",
  keyFilename: "KEYNAME.json"
};
const Storage = require('@google-cloud/storage')(gcconfig)
const bucketPath = 'MYPROJECTNAME.appspot.com'
const bucket = Storage.bucket(bucketPath);

exports.getFileFromStorage = functions.https.onRequest((req, res) => {
      let fileName = 'documents/someTemplate.docx'
      let tempFilePath = path.join(os.tmpdir(), fileName);

      return bucket.file(fileName)
      .download({
          destination: tempFilePath,
        })
        .then(() => {
          console.log(fileName + ' downloaded locally to', tempFilePath);
          let content = fs.readFileSync(tempFilePath, 'binary');

          // do stuff with the file and data from req.body

          return
        })
        .catch(err => {
          res.status(500).json({
            error: err
          });
        });
})

Я не понимаю, что когда я перемещаю файл в корневой каталог и использую вместо него имя файла someTemplate.docx, код работает.

В документации Google говорится, что

Объекты, добавленные в папку, кажутся находящимися внутри папки в консоли GCP. В действительности все объекты существуют на уровне корзины и просто включают структуру каталогов в свое имя. Например, если вы создаете папку с именем pets и добавляете в нее файл cat.jpeg, консоль GCP создает впечатление, что файл существует в папке. На самом деле отдельного объекта папки не существует: файл просто существует в корзине и имеет имя pets / cat.jpeg.

Это кажется правильным, поскольку в метаданных имя файла действительно documents/someTemplate.docx. Поэтому я не понимаю, почему приведенный выше код не работает.


  • Что именно не работает? Есть сообщение об ошибке? 21.08.2018
  • используйте firebase serve --only functions для локального запуска, чтобы можно было быстрее получать ошибки консоли. 21.08.2018
  • Кроме того, возможно, каталог не существует во временной папке? Может попробовать let tempFilePath = path.join(os.tmpdir(), 'tempkjhgfhjnmbvgh.docx'); 21.08.2018
  • @JamesPoag Спасибо, это была проблема, я не понимал, что папка не создается автоматически. Как ни странно, я никогда не получал сообщения об ошибке, хотя все время использовал firebase serve. Он скажет мне, например, Execution took 16 ms, user function completed successfully, но не запустит ни then, ни catch. 21.08.2018
  • Я думаю, что многие люди используют модуль узла tmp: npm install tmp 21.08.2018
  • @JamesPoag, не могли бы вы опубликовать свой хороший ответ в качестве ответа, чтобы его приняли и помогли другим пользователям легко его найти? 22.08.2018

Ответы:


1

Публикация ответа на комментарий от @James Poag для наглядности:

Кроме того, возможно, каталог не существует во временной папке? Может быть, попробуй, пусть tempFilePath = path.join(os.tmpdir(), 'tempkjhgfhjnmbvgh.docx'); - Джеймс Поаг 21 августа в 17:10

29.08.2018
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..