我的应用程序(React(使用Firestore的服务。当用户更改用户名时,我必须验证此用户名是否唯一。为此,我想使用Cloud函数来提高可靠性。然而,我的函数总是进入一个无限循环。我不知道该怎么摆脱它。
这是我的功能。
任何帮助都将不胜感激。
exports.checkUsername = functions.firestore
.document('/users/{userId}')
.onUpdate((change, context) => {
const before = change.before.data();
const after = change.after.data();
if (after.username === before.username) {
return null;
}
db.collection('users').where('username', '==', after.username).get()
.then((query) => {
if (!query.empty) {
// Username not available
return change.before.ref.update({ username: before.username });
}
// Username available
return null;
})
.catch(() => {
return change.before.ref.update({ username: before.username });
})
});
您没有正确处理承诺。您的函数需要返回一个promise,该promise在所有异步工作完成后解析。这就是云功能知道终止和清理是安全的。现在,在用户名前后不相等的情况下,函数不返回任何内容。
至少,你应该从链中返回最后的承诺:
return db.collection('users').where('username', '==', after.username).get()
.then(...)
.catch(...)