Cloud Functions Firestore获取增量的键值



当管理员创建用户时,我正试图使用云函数从文档中获取成员编号的更新编号。

应该发生的是,当管理员在其面板中创建用户时,该用户被添加到firebase,然后成员编号更新,并应用到newMemNum,然后在用户文档中更新。

我的代码:

const memNumInc = admin.firestore.FieldValue.increment(1);
const memCounter = admin.firestore().collection(`mem_num`).doc(`a1lDbrsoXjfKeosEkDtw`);
memCounter.update({number: memNumInc}).then(() => 
memCounter.get()
.then((snap) => {
const id  = snap.id;
const data = snap.data()
newMemNum = data['number']
console.log('New Member Number: ' + newMemNum);
return {id, ...data};
})
);

增量正常(即数字按预期增加1(,但代码的下一部分不会运行,也不会引发错误。

此外,更新用户文档的代码的下一部分根本不会启动,也不会出现错误。

完整代码:

// Create User Document onCreate
const createProfile = (userRecord) => {
const uid = userRecord.uid;
const docId = userRecord.uid;
const fullName = userRecord.displayName || 'New User';
const memStatus = 'Unfinancial';
const isAdmin = false;
const isNew = true;
const email = userRecord.email;
const photoUrl = userRecord.photoUrl;
const phone = '0444 123 456';
const createdAt = admin.firestore.FieldValue.serverTimestamp();
const memNumInc = admin.firestore.FieldValue.increment(1);
const memCounter = admin.firestore().collection(`mem_num`).doc(`a1lDbrsoXjfKeosEkDtw`);
memCounter.update({number: memNumInc}).then(() => 
memCounter.get()
.then((snap) => {
const id  = snap.id;
const data = snap.data()
newMemNum = data['number']
console.log('New Member Number: ' + newMemNum);
return {id, ...data};
})
);
return afs
.collection(`users`)
.doc(docId)
.set({
uid: uid,
docId: docId,
fullName: fullName,
joined: createdAt,
memNum: newMemNum,
memStatus: memStatus,
isAdmin: isAdmin,
isNew: isNew,
email: email,
photoUrl: photoUrl,
phone: phone,
addedOn: createdAt,
updatedOn: createdAt
})
.then(() => console.log('User Creaeted Successfuly: ' + uid))
.catch((e) => console.log('User Creation Error: ' + e.message));

}

exports.authOnCreate=functions.auth.user((.onCreate(createProfile(;

如果我删除memCounter代码,其余的代码执行起来没有问题。

您有另一个return语句,它很可能在get()返回的promise被解析之前运行。尝试使用async-await语法重构代码,如下所示:

const createProfile = async (userRecord) => {
// const vars ....
const memNumInc = admin.firestore.FieldValue.increment(1);
const memCounter = admin.firestore().collection(`mem_num`).doc(`a1lDbrsoXjfKeosEkDtw`);
// Update documents
await memCounter.update({
number: memNumInc
})
// Get update document data
const snap = await memCounter.get()
const id = snap.id;
const data = snap.data()
newMemNum = data['number']
console.log('New Member Number: ' + newMemNum);
return afs
.collection(`users`)
.doc(docId)
.set({ ... })
}

但是,如果同时创建多个用户,则他们有可能获得相同的newMemNum,因此事务可能也很有用。

Firestore还引入了一个新的COUNT((函数,该函数可用于获取集合中的文档总数,而不是每次递增计数。

最新更新