在node.js异步执行MongoDB时遇到麻烦
Having trouble trying to execute find with MongoDB in node.js asynchronously
我正在从我的路由中抓取一个请求参数,例如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。检查这个。:)
相关文章:
- 使用JavaScript获取Google地图上显示的所有推文时遇到麻烦
- 在 Javascript 中添加数字时遇到麻烦
- 使用 Coffeescript 和 Express .js 将变量传递给 Jade 时遇到麻烦
- 编写正确的 jQuery 插件时遇到麻烦
- 在三.js中更改纹理时遇到麻烦
- 从 javascript 中的函数返回时遇到麻烦
- 理解 $.ajax() 参数以获取 PHP 变量时遇到麻烦
- 比较数组时遇到麻烦
- 使 JavaScript 函数工作时遇到麻烦
- 在Firefox和IE中获取CSS属性时遇到麻烦
- 将 Blueimp Gallery 与 HTML 和 Bootstrap 集成时遇到麻烦
- 将jQuery导入WordPress时遇到麻烦
- 在解决来自 coderbyte 的 JavaScript 编码挑战时遇到麻烦
- 从页面抓取时遇到麻烦
- 让jQuery在Wordpress中工作时遇到麻烦
- 在codeigniter框架中添加css和js文件时遇到麻烦
- 处理由dayClick返回的日期时遇到麻烦
- 在使用jQuery更改依赖于滚动位置的类时遇到麻烦
- 在使用javascript加速滚动动画时遇到麻烦
- 在跨域jquery/Ajax服务调用中遇到麻烦