在node.js异步执行MongoDB时遇到麻烦

Having trouble trying to execute find with MongoDB in node.js asynchronously

本文关键字:遇到 麻烦 MongoDB 执行 node js 异步      更新时间:2023-09-26

我正在从我的路由中抓取一个请求参数,例如mydomain.com/topic/animals,其中requestParam = req.params.topicName,在这种情况下,animals

我循环遍历包含所有可能主题的对象,然后如果我找到与requestParam匹配的topicName,那么我想执行对数据库的调用以返回该主题的所有集合。

问题是它是同步执行的,因为它总是执行else子句,例如

if (requestParam === topicName) {
  // fetch submission
} else {
  // return 404
}

所以它总是返回404,但是如果我去掉这里的else子句,那么它就工作了。我看了看下划线的_.after(),但不能让它正常工作(甚至不确定如果这是我应该使用?

我代码:

_.each(topics, function(key, topic) {
  var topicName = key['topicName'],
  if (requestParam === topicName) {
    Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
      if (err) {
        res.redirect('/');
      } else if (submissions) {
        res.render('topic', {
          submissions: submissions
        });
      } else {
        res.redirect('/topics');
      }
    });
  } else {
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
  }
});

问题是您不应该在每次迭代中呈现404。因为执行的是异步查找,所以它被安排在未来某个时间点执行,而当前函数继续运行。毫无疑问,您将在某个时候遇到不同的问题,并至少渲染一次404。使用可中断的迭代,在搜索时进行标记,并在迭代之外执行404,如下所示:

var isWaitingForResult = false;
topics.every(function(topic, key) { // TODO: Check if this iterator matches _.each
    var topicName = key['topicName'],
    if (requestParam === topicName) {
      isWaitingForResult = true; // Wait for the result.
      Submission.getTopicSubmissions({ topicName : topicName }, function(err, submissions) {
        if (err) {
          res.redirect('/');
        } else if (submissions) {
          res.render('topic', {
            submissions: submissions
          });
        } else {
          res.redirect('/topics');
        }
      });
      return false; // stop iteration, we did start our search after all
    }
    return true; // continue iteration so we have another chance.
});
if (!isWaitingForResult) { // did a search NOT start?
    res.render('errors/404', {
      title: 'Page Not Found -',
      status: 404,
      url: req.url
    });
}

注意,我不确定我是否正确地将each重写为every。检查这个。:)