带有Firestore查询的POST请求正文未定义

时间:2019-07-08 17:53:07

标签: firebase google-cloud-firestore google-cloud-functions

我具有以下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”,它也可以正常工作并返回相应的文档。我做错了什么吗?

1 个答案:

答案 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);
    });
})