将包含异步查询的函数调用到mongodb.find的函数

时间:2018-05-26 17:33:51

标签: javascript node.js mongodb asynchronous

有没有办法在其他函数中调用包含mongoose查询的函数,这样其他函数才能正常工作?

我的第一个包含mongoose查询的函数:

getUserTags = (id) => {
    User.findById(id)
    .exec( (error, user) => {
      if (error) {
        return next(error);
      } else {       
        return user;
      }
    })
}

和我需要调用第一个函数的函数:

userTagToBookTagValues =  (id) => {
  const user = getUserTags(id);

  //I NEED THIS PART TO WORK AFTER getting data from getUserTags
  console.log(user);
  user.tags.forEach(tag => {
    console.log(tag)
  });
}

有没有办法让它正常工作,第二个功能的用户不会被定义?

3 个答案:

答案 0 :(得分:0)

您可能需要return User.findById? 像这样:

getUserTags = (id) => {
return User.findById(id)
.exec( (error, user) => {
  if (error) {
    return next(error);
  } else {       
    return user;
  }
})
}

答案 1 :(得分:0)

findById是一种异步方法。

如果您的节点版本大于8

getUserTags = id => User.findById(id).exec();

userTagToBookTagValues = async (id) => {
  try {
    const user = await getUserTags(id);
    user.tags.forEach(tag => {
      console.log(tag)
    });
  } catch (err) {
    next(err);
  }
}

或者你可以在调用getUserTags函数后使用then方法。

有关asnc方法的更多信息:

Medium

答案 2 :(得分:0)

据我所知.exec()不返回任何内容,因此使用.then会出错。 但是,如果像这样重写,它可以完美地运行:

getUserTags = (id) => {
  return User.findById(id)
}

userTagToBookTagValues =  (id) => {
const user =  getUserTags(id).then((user) => {
  user.tags.forEach(tag => {
    console.log(tag)
  });
  }) ;
}