返回并应用MongoDB中的值很困难

时间:2018-04-03 11:20:11

标签: javascript node.js mongodb mongoose

我正在构建一个函数,在我通过唯一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显示该内容?

1 个答案:

答案 0 :(得分:1)

async functionsPromises是回调的替代品!所以就这样做:

 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);

所以现在所有评论都被更新后,记录了数据。