嵌套查询两个不同集合时的奇怪结果

时间:2017-11-25 17:23:11

标签: node.js mongodb express mongoose

我需要检查Mongo中的两个单独的集合,以查看是否存在电话号码。

我首先创建了一个名为'ownerId'的全局变量

然后我在一个集合中调用'Profile'。如果我传递的电子邮件值存在于该集合中文档的“电子邮件”数组中,我将使用该文档中名为“owner_id”的值填充我创建的“ownerId”变量。

然后我查看另一个名为“User”的集合,它有一个电子邮件字段。如果我传递的电子邮件值存在于该集合中的文档中,我将使用该文档的“_id”填充我创建的“ownerId”变量。

我的查询嵌套在一对'then()'语句中。

这是我的代码:

<tr>

结果并不如我所料。

如果'Profile'查询为true并找到匹配项,那么它将使用值控制台记录ownerId。

如果第二个“用户”查询为真,但“配置文件”不匹配,则会控制日志“空”。我希望它能控制登录用户结果的_id值。

任何人都可以在我的逻辑中看到错误吗?

1 个答案:

答案 0 :(得分:0)

我不会混合回调和承诺。我建议使用async/await。它使异步代码看起来是同步的。例如:

let owner_id;

try {
  let profile = await Profile.findOne({ 'emails.email_address': req.body.invited_email });
  let user = await User.findOne({ 'email': req.body.invited_email }):

  if (profile) {
    owner_id = profile.owner_id;
  } else if (user) {
    owner_id = user.owner_id;
  } else {
    console.log('no owner id found');
  }
} catch(err) {
   console.log(err);
}

代码包含在try / catch中以处理错误,就像普通承诺的catch()方法一样。使用await的功能需要async关键字。

await用于等待承诺完成。不需要回调。您可以看到代码看起来像普通的同步代码。