Облачная функция Firebase: время окончания выполнения - PullRequest
0 голосов
/ 22 декабря 2019

У меня есть функция изменения размера изображения в облаке. Когда я оглядываюсь на журналы, я вижу, что выполнение функции заняло 1014 мс. Но после выполнения функция по-прежнему показывает журналы (выполняет то, что должна, изображение изменяется).

Cloud function progress

Так есть лизадержка в журналах или действительно ли выполнение этой функции занимает больше минуты (что может быть проблемой для счета?)?

Заранее спасибо!

ОБНОВЛЕНИЕ: это моекод:

export const makeRoundPicture = functions.https.onCall(async (data, context) => {
  var bucket = admin.storage().bucket();
  console.log(context.auth.uid);

  if (context.auth.uid != null) {
    await tmp.dir(async function _tempDirCreated(err: any, path: any) {
      if (err) throw err;

      var initialurl = "https://firebasestorage.googleapis.com/v0/b/myproject.appspot.com/o/"+context.auth.uid+".jpg?alt=media";

      const options = {
        url: initialurl,
        dest: path
      }

      console.log('Dir: ', path);

      await download.image(options)
        .then(async (filename: any) => {
          console.log('Saved');
          console.log(filename['filename']);

          var uploadPath = filename['filename'];

          var original = uploadPath; 
          var output = path+"photo.png";
          var size = 230;

          await gm(original)
            .resize(size, size)
            .write(output, function() {
              gm(size, size, 'none')
                .fill(output)
                .drawCircle(size/2.05 ,size/2.05, size/2.05, 0)
                .write(output, async function(err6: any) {
                  console.log(err6 || 'done');
                  await bucket.upload(output, {
                    destination: "myfolder/"+context.auth.uid+".png",
                  });
                });
            });
        })
        .catch((err4: any) => console.error(err4))
    });
  } else {
    console.log("unAuthorized request");
  }
});

1 Ответ

1 голос
/ 22 декабря 2019

Ваша проблема возникает из-за смешивания API Promises и API обратного вызова.

Синтаксис async / await работает только тогда, когда объединяются обещания.

Например, эта строка await tmp.dirне ждет, пока _tempDirCreated оценит и вернет ожидаемые обещания.

await tmp.dir(async function _tempDirCreated(err: any, path: any) {
  /* ... */
});
// this line gets called immediately

Короче говоря, вам нужно будет либо принять основанные на обещаниях API, такие как tmp-promise вместо node-tmp,или оберните всю свою функцию в Обещание.

const tmp = require('tmp-promise');

export const makeRoundPicture = functions.https.onCall(async (data, context) => {

  if (!context.auth) {
    throw new functions.https.HttpsError('failed-precondition', 'The function must be called while authenticated.');
  }

  console.log('Called by: ', context.auth.uid);

  const bucket = admin.storage().bucket();
  const { path: tmpDirPath } = await tmp.dir();

  const initialurl = "https://firebasestorage.googleapis.com/v0/b/myproject.appspot.com/o/"+context.auth.uid+".jpg?alt=media";

  const options = {
    url: initialurl,
    dest: tmpDirPath
  }

  console.log('Temp Dir: ', tmpDirPath);

  let { filename: originalFilename } = await download.image(options);

  console.log('Saved: ', originalFilename);

  let output = tmpDirPath + "photo.png";
  let size = 230;

  await gmMakeRoundPicture(originalFilename, output, size);

  await bucket.upload(output, {
    destination: "myfolder/"+context.auth.uid+".png",
  });
});

function gmMakeRoundPicture(inFilePath, outFilePath, size) {
  return new Promise((resolve, reject) => {
    gm(inFilePath)
      .resize(size, size)
      .write(outFilePath, async (err) => {
        if (err) return reject(err);

        gm(size, size, 'none')
          .fill(outFilePath)
          .drawCircle(size/2.05, size/2.05, size/2.05, 0)
          .write(outFilePath, (err) => err ? reject(err) : resolve());
      })
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...