Ошибка в функции firebase, генерирующей пользовательский токен

# #node.js #firebase #google-cloud-functions

Вопрос:

Я пытаюсь реализовать функцию Firebase, которая генерирует пользовательский токен для моего приложения. Но я продолжаю получать следующее сообщение об ошибке :

Ошибка: не удалось обработать запрос

Или это закончится таймаутом.

У вас есть какие-либо идеи о том, что может быть не так с моим кодом в дальнейшем ? Я пытаюсь сделать это с помощью «тестового» идентификатора.

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
const serviceAccount = require('./serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

exports.customFunction = functions.https.onRequest((data, context) => {
  return admin.auth().createCustomToken('test')
  .then(customToken => {
      console.log(`The customToken is: ${customToken}`);
      return {
        status: 'success', 
        customToken: customToken
      };
  })
  .catch(error => {
      console.error(`Something happened buddy: ${error}`)
      return {
        status: 'error'
      };
  });
});
 

Ответ №1:

Ваша облачная функция является функцией HTTPS. Для того, чтобы прекратить его , вам нужно позвонить res.redirect() res.send() , или res.end() , как описано в документе.

В своем коде вы фактически возвращаете цепочку обещаний: это правильный способ завершить облачную функцию, вызванную фоновыми событиями (что не относится к облачной функции HTTPS, которая запускается вызовом URL-адреса, который она предоставляет).

Итак, следующие изменения должны сделать свое дело (непроверенные):

 exports.customFunction = functions.https.onRequest((req, res)(data, context) => {
  admin.auth().createCustomToken('test')  // No need to return 
  .then(customToken => {
      console.log(`The customToken is: ${customToken}`);
      response.status(200).send({
        status: 'success', 
        customToken: customToken
      });
  })
  .catch(error => {
      console.error(`Something happened buddy: ${error}`)
      response.status(500).send(error);
  });
});
 

Обратите внимание, что при использовании облачной функции HTTPS объекты, которые вы передаете обработчику, являются не базой data данных и context объектами, а Express.js request и response предметы.

Так понятнее писать

 exports.customFunction = functions.https.onRequest((req, res) => {...});
 

вместо

 exports.customFunction = functions.https.onRequest((data, context) => {...});
 

Комментарии:

1. Я думаю, что ОП использовал onRequest вместо onCall этого здесь. остальная часть синтаксиса и использование (data, context) => {} подразумевают это.

2. @samthecodingman вы, скорее всего, правы! Пусть Пьер подтвердит это.