首页 > 解决方案 > 生成自定义令牌的 firebase 函数出错

问题描述

我正在尝试实现为我的应用生成自定义令牌的 Firebase 函数。但我不断收到以下错误消息:

错误:无法处理请求

或者它以超时结束。

你知道我的代码以后有什么问题吗?我正在尝试使用“测试”uid。

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'
      };
  });
});

标签: node.jsfirebasegoogle-cloud-functions

解决方案


您的 Cloud Function 是HTTPS 的。为了终止它,您需要调用res.redirect(),res.send()docres.end()中的说明。

在您的代码中,您实际上返回了 Promises 链:这是终止由后台事件触发的云函数的正确方法(这不是由调用它公开的 URL 触发的 HTTPS 云函数的情况)。

因此,以下更改应该可以解决问题(未经测试):

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 云函数,您传递给处理程序的对象不是 Firebasedatacontext对象,而是 Express.jsrequestresponse对象。

所以写的更清楚

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

代替

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

推荐阅读