这是我正在执行的代码:
exports.checkPin = functions.https.onCall(async (req, res) => {
let roomDoc = await db.collection('Rooms').where('roomNum', "==", req.roomNum).get();
if (roomDoc.exists) {
if (bcrypt.compareSync(roomDoc.data().pin, req.pin)) {
res.status(200).send("authorised");
} else {
res.status(401).send("unauthorised");
}
} else {
res.status(401).send("unauthorised");
}
});
执行代码后,它抛出一个错误,指出res.status()
是undefined
我做错什么了吗?如果Firebase函数执行完毕,我希望能够发送响应HTTP代码,这不是正确的方法吗?
答案 0 :(得分:2)
您正在混淆Callable Cloud Functions和HTTP Cloud Functions。
res.status(XXX).send("...");
必须在HTTP云功能中完成,而不是在可调用的功能中完成。
也,请注意,roomDoc
返回QuerySnapshot
而不是DocumentSnapshot
。
因此,您应该按以下方式调整功能(假设查询仅返回一个文档):
exports.checkPin = functions.https.onRequest(async (req, res) => { // <--- See here, we use onRequest and not onCall
const querySnapshot = await db.collection('Rooms').where('roomNum', "==", req.roomNum).get();
if (!querySnapshot.empty) {
const roomDoc = querySnapshot.docs[0];
if (bcrypt.compareSync(roomDoc.data().pin, req.pin)) {
res.send("authorised");
} else {
res.status(500).send("unauthorised");
}
} else {
res.status(500).send("unauthorised");
}
PS:您可以在HTTPS Cloud Functions上观看此官方视频:https://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3