firestore api让我有点混淆,试图找到一个可重复的模式来查找或创建样式函数。我希望规范版看起来像这样:
// returns a promise resolving to a DocumentSnapshot (I think??)
function findOrCreateMyObject(myObject) {
return findMyObject(myObject.identifier).then(documentSnapshot => {
return (documentSnapshot)? documentSnapshot : createMyObject(myObject);
});
};
我不确定DocumentSnapshot是否是相应的返回,但我认为调用者可能想要检查或更新结果,如下所示:
return findOrCreateMyObject({ identifier:'foo' }).then(documentSnapshot => {
console.log(documentSnapshot.data.someProperty);
return documentSnapshot.ref.update({ someProperty:'bar' });
});
假设我是对的(如果没有,请告诉我),这意味着find和create函数都必须返回DocumentSnapshot。这很容易找到...
function findMyObject(identifier) {
let query = db.collection('my-object-collection').where('identifier','=='identifier);
return query.get().then(querySnapshot => {
return (querySnapshot.docs.length)? querySnapshot.docs[0] : null;
});
}
......但是对于创作和我的问题的要点来说相当尴尬。我想写这样的创作....
function createMyObject(myObject) {
// get db from admin
let collectionRef = db.collection('my-object-collection');
return db.collection('my-object-collection').doc().set(myObject);
}
但我不能因为DocumentReference set()
解析为“包含void的非null承诺”。空虚吗?我必须读回我刚写的对象才能获得它的引用?换句话说,我的理想化创作需要被重写为更慢和更笨拙......
function createMyObject(myObject) {
// get db from admin
let collectionRef = db.collection('my-object-collection');
return db.collection('my-object-collection').doc().set(myObject).then(() => {
// must we query the thing just written?
return findMyObject(myObject.identifier); // frowny face
});
}
这使得我的通用创建时间更长(并且在执行 创建时不必要)。请告诉我:
谢谢!
编辑作为我应用此处的示例,请说我有客户,通过电子邮件进行唯一标识,并且他们的状态为:'gold','silver'或'bronze'。我的CRM系统决定将自己标识为doug@stevenson.com的人应该获得“白银”身份。我们现在还不知道史蒂文森先生是现任客户,所以我们做了一个发现或创造...
findOrCreateCustomer({ email:'doug@stevenson.com' }).then(customer => {
customer.update({ status:'silver' });
});
我不会创建,因为客户可能存在。我不会更新,因为客户可能不存在,或者可能不符合更新的其他标准。