Firebase的云功能运行到无限循环

时间:2017-04-18 18:35:29

标签: javascript firebase google-cloud-functions

我有一个自定义逻辑来验证用户。

我为Firebase编写了一个Cloud Function并验证了自定义令牌。

问题是云功能没有被终止并且正在进入无限循环,直到Firebase杀死该功能

云功能在匹配和非匹配场景中都会无限。

以下是代码:

/*  CLOUD FUNCTION */
exports.verifyToken = functions.https.onRequest((req, res) => {

  var corsFn = cors();
  corsFn(req, res, function () {
    verifyTheUserToken(req, res);

  });
});


function verifyTheUserToken(req, res) {


  if (!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) {
    console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.');
    res.status(403).send('Unauthorized');
  }

  const firebaseToken = req.headers.authorization.split('Bearer ')[1];
  const userId = req.body.uid;
  const receievedToken = req.body.token;

  return admin.auth().verifyIdToken(firebaseToken).then(decodedFirebaseToken => {
    console.log('ID Token correctly decoded', decodedFirebaseToken);
    console.log('req', req.body);
    return 'sucess';

  }).then(function (receivedValues) {

    return admin.database().ref().child('userTokens').child(userId).child('token').once('value');

  }).then(function (snapshot) {

    if (!snapshot.val()) {
      return Promise.reject('token is not set ');
    }

    if (snapshot.val() != receievedToken) {
      return Promise.reject('token doesnt match');
    }

    return 'verified';

  }).then(function (success) {

    return admin.database().ref().child('users').child(userId).child('isVerified').set(true);

  }).then(function (success) {

    console.log('The user is verified');
    return;

  }).catch(function (error) {

    console.log('Error', error);
    return;
  });

}

客户端我正在做一个HTTP请求来调用firebase云功能。

/* CLIENT SIDE */
var currentUser = firebase.auth().currentUser.uid;
var firebaseUserToken = firebase.auth().currentUser.getToken();

firebase.auth().currentUser.getToken(/* forceRefresh */ true).then(function (firebaseUserToken) {
  fetch('https://us-central1-MYAPP.cloudfunctions.net/verifyToken', {

    'method': 'POST',
    'headers': {
      'Authorization': 'Bearer ' + firebaseUserToken,
      'Content-Type': 'application/json'
    },
    'body': JSON.stringify({
      'uid': currentUser,
      'token': 1234,
    })
  }).then(function (response) {
    console.log('successful response');
  }).catch(function (error) {
    console.error('Error in fetch', error);

  });

}).catch(function (error) {
  console.error('Error in getting firebase token', error);

});

我无法弄清楚无限循环的原因。

我真的很感激任何帮助。 谢谢!

1 个答案:

答案 0 :(得分:1)

我在成功案例中错过了res.send()

根据文件:

始终使用send(),redirect()或end()结束HTTP功能。否则,您的功能可能会继续运行并被系统强行终止。

https://firebase.google.com/docs/functions/http-events