我想我没有正确地获得用于Node.js的Google Firestore API。所以我想问一下,后面两次执行,后台发生了什么,因为我得到了两个不同的结果。
第一:
async function getDocument(db, path) {
const cityRef = db.doc(path);
const doc = await cityRef.get();
if (!doc.exists) {
console.log('No such document!');
} else {
console.log('Document data:', doc.data());
}
}
const aDatabase = admin.firestore();
const aPath = 'path/to/document';
getDocument(aDatabase, aPath);
这是我在Firestore文档中找到的第一个代码片段。它按预期工作。doc
的类型是DocumentQuerySnapshot。我可以像往常一样访问文档的数据。一切都很好。在控制台中,输出是一个包含存储数据的JSON-Object。
第二:
async function getDocument(db, path) {
const cityRef = db.doc(path);
const doc = await cityRef.get();
if (!doc.exists) {
console.log('No such document!');
} else {
console.log('Document data:', doc.data());
return doc.data();
}
}
const aDatabase = admin.firestore();
const aPath = 'path/to/document';
const docData = getDocument(aDatabase, aPath);
console.log('docData:', docData);
此代码段仅由最后两行扩展。在本例中,docData不再是DocumentQuerySnapshot。这是一个悬而未决的承诺。那就是我生气的时刻。我无法访问文档的数据。我可以,如果我做一些类似docdata.then(。。。)
的事情。但是为什么函数“get document”会突然返回一个承诺。
async
函数总是返回承诺。若要访问最终值,您需要调用promise上的。然后调用
,并指定promise解决后要运行的代码:
getDocument(aDatabase, aPath)
.then(docData) => {
console.log('docData:', docData);
})
或者将代码放在async
函数中并使用await
:
async function someFunction() {
// ...
const docData = await getDocument(aDatabase, aPath);
console.log('docData:', docData);
}
注意,即使在第一个示例中,您也必须等待一个承诺:
const doc = await cityRef.get();
这允许异步函数的其余部分等待操作完成后再继续。如果您希望调用getDocument
的代码也等待,那么它也需要执行await。