因此,我一直在编写一些代码以将Firestore与另一个程序的数据库同步,所以我添加了引用。
我希望我的onCreate方法从卖方条目中获取参考号,并使用该参考号创建一个新文档,以及在现有文档中更新orderReference字段(我希望数据库来处理它,而不是对客户/应用程序),请删除先前的订单,因为它的ID无法从函数中进行更新,并更新orderNumber字段。
我没有创建新文档,也没有更新值。我真的是Node.js和Promise的新手。欢迎任何提示和建议。
exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
var id = snapshot.id; //id of order document
var sellerID = snapshot.data().sellerID;
var orderNumber = 0;
var content;
var sellerSnapID;
return admin.firestore().collection('sellers').where("ID", "==", sellerID).get().then((qSnapshot) => {
var docs = qSnapshot.docs;
orderNumber = docs[0].data().orderReferenceNumber;
sellerSnapID = docs[0].id;
content = snapshot.data();
Object.assign(content, {orderReference: orderNumber});
console.log(content); // <----- last execution
return content;
}).then(() => {
return admin.firestore().collection('orders').doc(orderNumber).set(content).then(() => {
var promises = [];
promises.push(admin.firestore().collection('orders').doc(id).delete());
orderNumber++;
promises.push(admin.firestore().collection('sellers').doc(sellerSnapID).update({orderReferenceNumber: orderNumber}));
return Promise.all(promises);
});
}).catch((err) => {
return err;
});
更新的代码
exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
var id = snapshot.id; //id of order document
var sellerID = snapshot.data().sellerID;
var orderNumber = 0;
var content;
var sellerSnapID;
return admin.firestore().collection('sellers').where("ID", "==", sellerID).get().then((qSnapshot) => {
var docs = qSnapshot.docs;
orderNumber = docs[0].data().orderReferenceNumber;
var orderID = docs[0].data().orderReferenceNumber;
sellerSnapID = docs[0].id;
content = snapshot.data();
content.orderReference = orderNumber;
return admin.firestore().collection('orders').doc(orderID).set(content);
}).then(() => {
orderNumber++;
var promises = [];
promises.push(admin.firestore().collection('orders').doc(id).delete());
promises.push(admin.firestore().collection('sellers').doc(sellerSnapID).update({orderReferenceNumber: orderNumber}));
return Promise.all(promises);
}).catch((err) => {
return err;
});
});
答案 0 :(得分:1)
如果您要链接承诺,则需要在then()
内返回承诺。
如果该函数作为处理程序传递给,则返回一个Promise,则 等效的Promise将在 方法链。
当前,您第一次返回content
,这不是一个承诺。您应该按照以下几行来修改代码:
exports.createOrderReference = functions.firestore.document('/orders/{order}').onCreate((snapshot, context) => {
var id = snapshot.id; //id of order document
var sellerID = snapshot.data().sellerID;
//....
return admin.firestore().collection('sellers').where("ID", "==", sellerID).get()
.then((qSnapshot) => {
//.....
//Set the value of content
//Return a promise (from the set() method)
return admin.firestore().collection('orders').doc(orderNumber).set(content);
})
.then(() => {
//.....
//Return a promise, as you do with
return Promise.all(promises);
})
.then(results => {
//.....
//Return a promise
}).catch((err) => {
console.log(err)
return null;
});
您还可以在这里观看官方的Firebase视频系列:https://firebase.google.com/docs/functions/video-series/。尤其要观看三个名为“学习JavaScript的承诺”的视频(第2和第3部分特别关注后台触发的Cloud Functions,但之前确实值得观看第1部分)。