我具有以下firebase云功能,用于检查用户名是否存在于任何firestore文档中。我在客户端使用Context-Type的POST请求:application / JSON
exports.login = functions.https.onRequest((request, response) => {
response.set('Access-Control-Allow-Headers', 'Content-Type');
console.log(request.body);
let query = admin.firestore().collection("admin").where("username", "==", request.body.username);
query.get().then(snapshot => {
let loginStatus = false;
if (snapshot.length > 0) loginStatus= true;
response.send(loginStatus);
return;
}).catch();
response.send(<NOT_IMPORTANT>);
})
如果我评论了let query = admin...
,则可以正确登录request.body
。但是有了这一行,request.body变得不确定,并且我不能在查询中使用它。如果我在查询中将request.body.username硬编码为“ 123”,它也可以正常工作并返回相应的文档。我做错了什么吗?
答案 0 :(得分:1)
我认为您的问题很可能是由于您使用的是异步命令,在您对.get()
进行全面评估时,您的response.send(<NOT_IMPORTANT>)
已经被解雇,并已关闭该要求
您需要从函数末尾删除response.send(<NOT_IMPORTANT>);
。给您的.get()
查询时间来运行。
也与该主题相关...虽然您的数据库很小,但这可能不是问题...但是我建议您遵循best practices to ensure your cloud function has enough time to run并返回诺言。这些文档包括解释:
通过返回
.set()
的结果,可以确保函数一直运行,直到完全完成将字符串写入数据库的异步工作为止exports.hello = functions.database.ref('/hello').onWrite(event => { // set() returns a promise. We keep the function alive by returning it. return event.data.ref.set('world!').then(() => { console.log('Write succeeded!'); }); });
所以我的建议是:
exports.login = functions.https.onRequest((request, response) => {
response.set('Access-Control-Allow-Headers', 'Content-Type');
let query = admin.firestore().collection("admin").where("username", "==", request.body.username);
return query.get().then(snapshot => {
let loginStatus = false;
if (snapshot.length > 0) loginStatus= true;
response.send(loginStatus);
}).catch(err => {
console.log(err);
});
})