Сохранение изображения в gcloud с помощью облачной функции Firebase - PullRequest
0 голосов
/ 05 марта 2019

Я хотел бы сохранить выбранное изображение из всплывающего окна в облачной функции - чтобы запустить его в фоновом режиме.Вот мой код:

export const getUnsplashCron = functions
  .region('europe-west1')
  .runWith({ memory: '512MB', timeoutSeconds: 15 })
  .https.onRequest(async(req, res) => {

    if (!req.query.url) {
      res.status(300).send('no url');
    }

    return request({
      url: req.query.url + '?client_id=' + environment.unsplash.appId,
      encoding: null
    }, (err, response, body) => {
      if (!err && response.statusCode === 200) {

        const stream = require('stream');
        const bufferStream = new stream.PassThrough();

        bufferStream.end(Buffer.from(body, 'base64'));

        const file = admin.storage().bucket().file('name.jpg');

        bufferStream.pipe(
          file.createWriteStream({
            public: true
          }))
          .on('error', function(error) {
            console.log(error);
            return res.status(500).send(error)
          })
          .on('finish', function() {

            const config: GetSignedUrlConfig = {
              action: 'read',
              expires: '01-01-2025'
            };
            file.getSignedUrl(config, function(error, url) {
              console.log(url);
              if (error) {
                return res.status(500).send(error);
              }
              return res.status(500).send(url);
            });

          });


      }
    });

  });

Но я получаю

Ошибка: не найдена в Util.parseHttpRespBody (/ srv / node_modules / @ google-cloud / common/ build /src/util.js:172:38) в Util.handleResp (/srv/node_modules/@google-cloud/common/build/src/util.js:116:117) в retryRequest (/ srv / node_modules /@ google-cloud / common / build / src / util.js: 404: 22) в onResponse (/srv/node_modules/retry-request/index.js:200:7) в / srv / node_modules / teeny-request / build/src/index.js:158:17 at at process._tickDomainCallback (внутренний / process / next_tick.js: 229: 7) код: 404, ошибки: [{{domain: 'global', причина: 'notFound', сообщение:'Not Found'}], ответ: undefined, сообщение: 'Not Found'}

Что я делаю не так ?!

1 Ответ

0 голосов
/ 06 марта 2019

Вы должны использовать обещания для обработки асинхронных задач (например, HTTP-вызов unsplash или запись в облачное хранилище). По умолчанию request не возвращает обещаний, поэтому вам нужно использовать интерфейсную оболочку для запроса, например request-promise.

Поэтому вы должны изменить свой код следующим образом:

const rp = require('request-promise');
.....

export const getUnsplashCron = functions
  .region('europe-west1')
  .runWith({ memory: '512MB', timeoutSeconds: 15 })
  .https.onRequest(async(req, res) => {

  .......

  const options = {
    uri: req.query.url + '?client_id=' + environment.unsplash.appId
  };

  rp(options)
    .then(response => {
      .... //Upload your file
      res.send('Success');
    })
    .catch(err => {
      // API call failed...
      res.status(500).send('Error': err);
    });
};

Вы можете посмотреть этот официальный видео-сериал для более подробной информации: https://firebase.google.com/docs/functions/video-series/ (в частности, 3 видео под названием «Изучите обещания JavaScript»).

...