我在防火墙中使用了云函数
功能思想是为会话设置领导者,如果没有领导者,返回领导者的用户id,我使用javascript。
它总是返回null,即使我返回snapshot.val
或函数接收的用户id。
console.log(snapshot.val)
给我对象对象
代码
exports.SetLeader = functions.https.onCall((data, context) => {
userID = data.ID
sessionID = data.text
sessionref = "/Sessions/".concat(sessionID);
sessionref = sessionref.concat("/Leader");
var db = admin.database();
var ref = db.ref(sessionref);
console.log("ID" + userID)
ref.once("value", function (snapshot) {
console.log("snapchot"+ snapshot.val()); //x
if (snapshot.val() == null) {
admin.database()
.ref(sessionref).update({ userID })
console.log("inside if " + userID)
return { leader: userID };
}else{
console.log("inside else " + snapshot.val())
return { leader: snapshot.val()};
}
}, function (errorObject) {
console.log("The read failed: " + errorObject.code);
});
});
如果没有领袖,请登录,设置新的领导并返回id。
如果有一个头目,我需要返回他的身份证
发布于 2021-03-28 01:30:32
正如在可调用云函数的doc中解释的那样,“要在异步操作之后返回数据,返回一个承诺的”。通过使用once()
方法的“回调版本”,您不会返回承诺。
您应该使用“允诺版本”如下:
return ref.once("value")
.then(snapshot => {...});
此外,由于您必须处理不同的情况,这取决于快照的值,所以在云函数中使用async/await
更易读。因此,以下内容应该能达到这个目的(未经测试):
exports.SetLeader = functions.https.onCall(async (data, context) => {
try {
const userID = data.ID
const sessionID = data.text
const sessionref = `/Sessions/${sessionID}/Leader` // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals
const db = admin.database();
const ref = db.ref(sessionref);
console.log("ID" + userID)
const snapshot = await ref.once("value");
console.log("snapchot" + snapshot.val());
if (snapshot.val() == null) {
await admin.database().ref(sessionref).update({ userID })
console.log("inside if " + userID)
return { leader: userID };
} else {
console.log("inside else " + snapshot.val())
return { leader: snapshot.val() };
}
} catch (error) {
// See https://firebase.google.com/docs/functions/callable#handle_errors
// for more fine grained error management
console.log(error);
return null;;
}
});
https://stackoverflow.com/questions/66839634
复制相似问题