Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase运行到无限循环的云函数_Javascript_Firebase_Google Cloud Functions - Fatal编程技术网

Javascript Firebase运行到无限循环的云函数

Javascript Firebase运行到无限循环的云函数,javascript,firebase,google-cloud-functions,Javascript,Firebase,Google Cloud Functions,我有一个自定义逻辑来验证用户 我已经为Firebase编写了一个云函数,用于验证自定义令牌 问题是云函数并没有终止,而是在无限循环中运行,直到Firebase终止该函数 云函数在匹配和非匹配场景中都会无限运行 代码如下: /* CLOUD FUNCTION */ exports.verifyToken = functions.https.onRequest((req, res) => { var corsFn = cors(); corsFn(req, res, functio

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

我已经为Firebase编写了一个云函数,用于验证自定义令牌

问题是云函数并没有终止,而是在无限循环中运行,直到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);

});
我无法找出无限循环的原因

我真的很感激在这方面的任何帮助。
谢谢

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

根据文件:

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


您有
res.status(403).send()
但是对于成功案例没有
res.send()
。HTTP函数必须使用
res.send()
(简单地返回承诺不会有任何作用),否则它们将永远挂起,直到被杀死。是的!!我缺少
res.send()
。但我仍然理解,即使我最初没有发送响应,为什么函数会执行多次。不管怎样,它解决了最初的问题,谢谢你的帮助@MichaelBleigh