Javascript Firebase运行到无限循环的云函数
我有一个自定义逻辑来验证用户 我已经为Firebase编写了一个云函数,用于验证自定义令牌 问题是云函数并没有终止,而是在无限循环中运行,直到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
/* 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