节点.js异步模块问题
Node.js async module issue
我正在尝试使用异步模块来减少特定于 Node.js 的"回调地狱"。基本上,我正在尝试使用async.series
从数据库中检索一些信息并将其显示在我的视图中。尽管如此,在我看来,我没有得到任何结果。
这是我到目前为止的代码:
// Search
exports.search = function(req, res) {
var x = [];
async.series([
function(cb) {
Lang.find({ lang: req.query.keyword }).sort({ verbal: -1 }).exec(function(err, langs) {
cb(null, langs);
});
},
function(cb) {
Human.find({}, function(err, humans) {
cb(null, humans);
});
}],
function(err, results) {
if (err) {
res.send(500);
}
for(var i = 0; i < results[0].length; i++) {
for(var j = 0; j < results[1].length; j++) {
if(results[1][j]._id == results[0][i].human) {
x.push(results[1][j]);
}
}
}
res.render('myView', { title: 'Search Results', humans: x });
}
);
}
我首先想查询 Lang 模型 (MongoDB) 并找到与 req.query.keyword
匹配的记录。之后,我想查询人类模型并找到所有具有该特定语言技能的人类。此外,FOR 循环旨在消除我的数组中的重复项,因为人类可能有多种语言。
如果我正确理解您的代码,您可能希望改用async.waterfall
。它将结果从一个函数作为参数传递给下一个函数。还可以进行一些其他优化:
async.waterfall([
function(done) {
Lang
.find({ lang: req.query.keyword })
.sort({ verbal: -1 }) // (not really useful)
.select('human') // not strictly necessary, but saves a bit of space
.exec(done); // short for :
// .exec(function(err, results) {
// done(err, results);
// });
},
function(langs, done) {
// extract the 'human' property from each result
var _ids = langs.map(function(lang) {
return lang.human;
});
// perform a query finding all humans in the list of ids
Human
.find({ _id : { $in : _ids } })
.exec(done);
}
], function(err, humans) {
if (err)
return res.send(500);
res.render('myView', {
title : 'Search Results',
humans: humans
});
});
编辑:因为$in
不保留顺序,这个答案表明使用$or
会,请尝试将其作为第二个查询的替代方法:
...
function(langs, done) {
var query = langs.map(function(lang) {
return { _id : lang.human };
});
Human
.find({ $or : query })
.exec(done);
}
...
相关文章:
- 导出模块 NodeJS 时出现问题
- 扩展错误es6类模块问题
- 在Node.js中使用异步模块时出现问题
- 挖空和显示模块模式的数据绑定问题
- Node.js模块问题
- Angularjs的智能表模块-与处理它有关的问题's指令
- Javascript 模块模式问题
- 我应该如何在JS中使用揭示模块模式,传递引用,并避免加载顺序问题
- 节点.js模块需要依赖问题
- ExpressJS 中记录器模块定义的问题
- 节点.js异步模块问题
- 问题 - AngularJS 未捕获错误: [$injector:模块rr]
- 仅在侦听器函数中加载脚本/模块会导致问题吗?
- 将模块安装为全局变量时遇到问题 -- /usr/bin/env 不是目录
- 使用茉莉花测试角度控制器 - 模块问题
- JavaScript 模块模式上下文问题
- 命令失败: gm 识别: 无法打开文件 (2) [没有这样的文件或目录].通用模块和 ES6 承诺的问题
- 在 Linux 操作系统上安装ibm_db模块时出现问题
- 使用ibm_db模块在Node JS中执行prepared语句时出现问题
- 我的角度模块出了什么问题