【发布时间】:2019-09-07 05:21:45
【问题描述】:
我是 Node.js 的新手,即使在阅读了其他 stackflow 用户提供的教程之后,我仍然在为 Promises 苦苦挣扎。我已经为此花费了整整一个晚上,我正在寻求帮助。我收到以下错误“函数返回未定义、预期的承诺或值”。我的代码如下。我究竟做错了什么?我还怀疑我必须使用 await/async,因为看起来我的代码正在运行,而无需等待第一次 get 完成。
const admin = require('firebase-admin');
const functions = require('firebase-functions');
var db = admin.firestore();
exports.declinedRequest = functions.firestore
.document('requests/{requestId}')
.onUpdate((change, context) => {
const newValue = change.after.data();
const status = newValue.status;
const request = context.params.requestId;
var registrationToken;
var message;
if(status=="created") {
console.log('Checkpoint1 ',context.params.requestId);
newValue.friends.forEach(doc => {
console.log('Checkpoint 2: ', doc);
var usersRef = db.collection('users');
var query = usersRef.where('mobile', '==', doc).get()
.then(snapshotFriend => {
if (snapshotFriend.empty) {
console.log('Checkpoint3.');
return;
}
snapshotFriend.forEach(mobile => {
registrationToken = mobile.data().fcmToken;
console.log('FCM token =>', registrationToken);
if (!registrationToken) {
console.log('No fcmToken available');
return;
}
message = {
notification: {
body: "Request still available from " + newValue.requesterName,
sound: "default",
badge: 1
},
data: {
requestId: `${request}`
}
};
console.log('FCM token message created');
})
})
})
} else {
return;
}
return admin.messaging().sendToDevice(registrationToken, message)
.then(function (response) {
console.log("Successfully sent message:", response)
})
.catch(function (error) {
console.log("Error sending message:", error);
})
})
【问题讨论】:
-
主要问题是当函数进入第一个
if块时,您没有从函数的顶层返回承诺。嵌套在回调和函数中的返回不会从顶层返回。此外,你没有任何义务使用 async/await,因为它只是一种方便的语法,与你使用then对 promise 执行的操作相同。 -
观看 Cloud Functions 上的 this video series 以及如何在其中使用 Promise 可能会有所帮助。它还有助于从一个简单的功能开始,然后再增加复杂性。现在,对于刚接触 node 的人来说,你所拥有的相当复杂。
-
谢谢你,道格。我看过这个视频系列,但没有遇到任何关于当 if 处于顶层时如何修复它的建议。我根据您的反馈做了一项更改(上面更新了代码)。但是,现在看起来底部的 return 比上面的代码执行得更快。我正在努力在返回之前插入等待。有什么建议吗?
标签: javascript node.js firebase promise google-cloud-functions