2 回答
TA贡献1725条经验 获得超7个赞
看起来您编写的代码旨在在将新订单添加到数据库时运行。但是你已经声明它像这样触发:
exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders')
.onWrite(async (snapshot, context) => {
这意味着只要在orders节点下为用户编写任何内容,代码就会触发。要仅在该orders节点下写入订单时触发,请将触发器定义为:
exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders/{orderid}')
.onWrite(async (snapshot, context) => {
上面的区别在于,路径现在包含{orderid}意味着它会触发树中的低一级,并且您snapshot.after将不再包含该-L级别。
由于您实际上似乎只关心订单何时被创建,因此您也只能触发它(这意味着当订单被更新或删除时,您的函数不会被调用)。那会是这样的:
exports.sendPushR = functions.database.ref('/request/{pid}/{uid}/orders/{orderid}')
.onCreate(async (snapshot, context) => {
...
const afterData = snapshot.val();
const username = snapshot.val().username;
console.log(afterData);
console.log(username);
...
});
在这里,我们再次在 JSON 中的较低级别上触发。但是由于我们现在 trigger onCreate,我们不再有前后快照,而是只是snapshot.val()为了获取刚刚创建的数据。
TA贡献1854条经验 获得超8个赞
由于您正在检索的对象具有生成的成员,您可以使用 for-in 循环来检索该值。
const object = snapshot.after.val()
for(const key in object) {
if (object.hasOwnProperty(key)) {
const element = object[key];
if(element.username) {
console.log(element.username);
break;
}
}
}
添加回答
举报