我正在构建一个函数,在我通过唯一ID(GUID)查询MongoDB之后将提取用户的userName。我将不得不在我的代码库中的多个点执行此操作,因此我将逻辑提取到其自己的帮助函数中。这是功能:
module.exports.getUserName = async function (GUID, callback) {
try {
var result = await User.findOne({
GUID: GUID
})
callback(result['_doc'].fullname)
} catch (e) {
console.log(e);
}
}
如果我console.log(result['_doc'].fullname)
它返回我想要的内容(用户的userName)。但是,当我尝试在我的路由中激活此函数时,JSON对象中的userName将返回null。这是调用它的函数:
dataset.comments.forEach(function(comment) {
comment.timestamp = util.timestampToDate(comment.timestamp).getTime()
Helper.getUserName(comment.userId, function(result) {
comment.userName = result;
})
});
如果我在该函数中console.log(result)
并使用Postman来查看我的路线,它会返回正确的名称。如果console.log(comment)
,则会返回附有用户名的评论。
但是,当我在Postman中运行我的路线并找到评论对象时,userName列为null
。好像这个函数永远不会被调用。
当我调用路由时(我每次都重新启动服务器以进行健全性检查!)然后注释返回为:
{
"timestamp": 1521822257000,
"actionId": "b9139c26-212b-4ebe-95a1-47c86f6c64ea",
"text": "paul",
"userId": "76889991-27f5-4613-b03a-17136e21a1aa",
"userName": null,
"userImage": "http://localhost:3001/api/users/76889991-27f5-4613-b03a-17136e21a1aa?image"
},
userName: null
是问题所在。如何使用用户的用户名而不是null
显示该内容?
答案 0 :(得分:1)
async functions
和Promises
是回调的替代品!所以就这样做:
async function getUserName (GUID, callback) {
var result = await User.findOne({
GUID: GUID
});
return result['_doc'].fullname;
}
然后您可以使用map
将数组映射到Promises数组,然后使用Promise.all
等待所有查询完成:
await Promise.all(dataset.comments.map(async function(comment) {
comment.timestamp = util.timestampToDate(comment.timestamp).getTime()
comment.username = await Helper.getUserName(comment.userId);
}));
console.log(dataset.comments);
所以现在所有评论都被更新后,记录了数据。