我有一个Firebase函数,该函数获取Firebase身份验证令牌并创建一个文档来存储用户设置(如果我的Firestore集合中没有给定用户的文档)。
该函数可以正常工作,但是我注意到它大约需要十秒钟才能完成。
使用堆栈驱动程序日志记录和一些日志语句,我已经将其缩小到我认为是罪魁祸首的一行:
const userDoc = await admin.firestore().doc('users/' + uid).get();
对于上下文,我有一个过滤器,该过滤器对身份验证令牌进行解码并将其存储在请求变量中。请求端点本身看起来像这样:
app.post('/register', (async (req, res) => {
console.log('New request to register user.');
const uid = req['user'].uid;
const userDoc = await admin.firestore().doc('users/' + uid).get();
if (!userDoc.exists) {
console.log('User does not exist. Creating.');
// Do stuff here
}
}));
我在stackdriver上获得的日志输出如下:
如您所见,第一条和第二条日志语句之间大约有8秒的延迟。我在这里看到的唯一值得注意的事情是文档请求。在此之后,我还有其他多个呼叫firestore的电话,它们没有显示这种延迟。
关于这种行为,我有两种理论:
由于这是我在此请求中对Firestore的首次调用(包括过滤器),因此Firestore可能需要首先进行初始化。就个人而言,看到高性能的Firestore在其他任何地方都是如此,我觉得这不太可能。
其次,更有可能的是,出于技术原因,在不存在的文档上读取文档可能会花费一些时间?在这种情况下,将uid
存储为文档的字段并在users
集合上创建适当的查询会更好吗?
我当然对此可能完全错了,或者我忘记了一些东西。对此,我将不胜感激。