承诺当数据存在时从Firestore返回空值



我调用了一个异步函数,并将用户id列表作为参数传递。该函数查询firestore以在该迭代中获取用户id的令牌。

async function getTokensForUsers(ids) {
const promises = ids.map(async (id) => {
console.log("Querying for user with id: " + id);
const querySnapshot = await db.collection('users').where('deviceUid', '==', id).get();
return querySnapshot.docs.map(doc => doc.data().deviceToken);
});
let tokens = await Promise.all(promises);
return tokens.flat();
}

方法如下:

const ids = await getIdsOfUsersWithName(name);
console.log("Getting tokens for users" + ids);
const tokens = await getTokensForUsers(ids);
console.log("Tokens" + tokens)

当最终的console.log()打印时,它打印为"Tokens,,,,,"当我可以在集合中看到数据时,这表明它没有从Promise返回数据。

我已经从您提供的代码中重新创建了这个问题,并获得了预期的结果。我已经尝试了firebase V9(模块化)和firebase V8(命名空间)。

这个问题似乎使deviceToken字段在firestore数据库集合中为空。我建议你修改这一行

return querySnapshot.docs.map(doc => doc.data().deviceToken);

const data = querySnapshot.docs.map((doc) => doc.data().deviceToken);
console.log(data);
return data;

这将显示从每个文档的doc.data().deviceToken返回的内容,并且正如您提到的,您将获得"令牌,,,,,"这意味着你可能会得到这样的内容:

[ '' ]
[ '' ]
[ '' ]
[ '' ]
[ '' ]
Tokens,,,,

看起来您的deviceToken字段是空的。下面是我成功工作的代码:

// Initialize Firebase
firebase.initializeApp(firebaseConfig);
const db = firebase.firestore();
async function getTokensForUsers(ids) {
const promises = ids.map(async (id) => {
console.log("Querying for user with id: " + id);
const querySnapshot = await db
.collection("users")
.where("deviceUid", "==", id)
.get();
const data = querySnapshot.docs.map((doc) => doc.data().deviceToken);
console.log(data);
return data;
});
let tokens = await Promise.all(promises);
return tokens.flat();
}
const name = "rohit";
async function fire() {
const ids = await getIdsOfUsersWithName(name);
console.log("Getting tokens for users: " + ids);
const tokens = await getTokensForUsers(ids);
console.log("Tokens" + tokens);
}
async function getIdsOfUsersWithName(name) { //assumed
const querySnapshot = await db
.collection("users")
.where("name", "==", name)
.get();
return querySnapshot.docs.map((doc) => doc.data().deviceUid);
}
fire();