我正在通过Firebase身份验证对用户进行身份验证,并在用户集合中保存一些有关用户的额外元数据。我想执行创建操作或创建失败的方法。我不想只在一个地方创建。
到目前为止,我有以下代码。这是非常危险的,因为很可能只有一个人可以创建而一个人可以失败:
const newUser = req.body;
try {
const user = await admin.auth().createUser(newUser);
/* Add user to users collection */
usersRef.doc(user.uid).set({
type: 'user',
notification: '',
bio: ''
});
res.status(201).json(response(user.uid, ''));
} catch (err) {
res.status(400).json(response(null, 'Something went wrong! Please try again.'));
}
我刚接触Firebase。我对该主题的知识非常有限。如果有人可以将我重定向到正确的方向,我将不胜感激。预先感谢!
答案 0 :(得分:1)
就我个人而言,我不会将其归类为“高度可能”错误。在实践中,您唯一担心失败的是文档创建,并且对于node.js代码,只有在超出某些Firestore限制(除非您正在处理的情况下,“极不可能发生”)时才会失败很多新用户的UID碰到单个Firestore内部分片高于其内部阈值(请参阅limits)。 UID是非常随机的,应该非常广泛地分布,因此这并不是真正的问题。如果您的服务器无法访问Internet,它也可能会失败,但是,如果它以前完成了用户创建,那么失去连接的真正机会是什么?
由于您在这里只有两项操作,因此您似乎可以简单地检查文档是否没有set()
(并确保await
返回的诺言,该诺言现在丢失了) )。如果失败,则只需delete the user并将错误返回给客户端。而且,如果您还担心用户删除失败,那么我认为您可能过度设计了这一段特定代码。您以后总是可以编写代码来定期检查用户帐户,以查看他们是否没有匹配的Firestore文档,然后删除它们。
您也可以通过using Cloud Functions to automatically create the document after the user account is created简化此操作。而且,如果将该功能标记为“重试”,则如果文档创建失败,它将重试文档几天,直到它起作用为止。