我正在使用ElasticSearch运行Express.js /
Node.js应用程序。我正在尝试查看同一索引中多种类型的结果。我在这里执行的是运行搜索查询,然后根据查询结果执行第二个搜索查询。通过观察node.js控制台,我还可以看到elasticsearch为玩家返回了结果。但是它们没有插入到我的结果对象/数组中。我使用快速中间件,因为我必须执行两个搜索并将结果显示为一个。
路线/index.js
function searchTeam(req, res, next){
searchModuleTeams.searchTeams(req.body, function(data) {
req.teams = data;
next();
});
}
function searchPlayer(req, res, next){
//req.players = [];
req.teams.forEach(function(team){
req.body = {searchTerm:team._source.shortName};
searchModulePlayers.searchPlayers(req.body, function(data){
req.players.push(data);
console.log(req.players);
});
});
next();
}
function renderResults(req, res){
res.render('index',{
title:'Search Teams and Players',
teams:req.teams,
players:req.players
});
}
router.post('/search-tp',searchTeam, searchPlayer, renderResults);
我通过阅读post1和post2提出了这个解决方案。我可以显示teams数组。但是什么都不来自玩家数组。我在这里做错了什么。
在searchPlayer
函数中,next()
应将调用放置在所调用的回调函数中searchPlayers()
,基本上与您对该searchTeam()
函数所做的完全相同。
function searchTeam(req, res, next){
searchModuleTeams.searchTeams(req.body, function(data) {
req.teams = data;
next();
});
}
function searchPlayer(req, res, next){
req.players = []; <--- uncomment this...
req.teams.forEach(function(team){
req.body = {searchTerm:team._source.shortName};
searchModulePlayers.searchPlayers(req.body, function(data){
req.players.push(data); <--- ...otherwise this will fail
next(); <--- move next() here
});
});
}
function renderResults(req, res){
res.render('index',{
title:'Search Teams and Players',
teams:req.teams,
players:req.players
});
}
router.post('/search-tp',searchTeam, searchPlayer, renderResults);
而且,正如TalhaAwan所建议的那样,您最好不要在中间件中执行此操作,而应使用专用的库,例如async
一个(但还有很多)
import waterfall from 'async/waterfall';
function searchTeam(callback){
searchModuleTeams.searchTeams(req.body, function(teams) {
callback(null, teams);
});
}
function searchPlayer(teams, callback){
let teamPlayers = [];
async.each(teams, function(team, teamCallback) {
let search = {searchTerm: team._source.shortName};
searchModulePlayers.searchPlayers(search, function(players){
teamPlayers.push(players);
teamCallback();
});
}, function(err) {
callback(err, teams, teamPlayers);
});
}
function renderResults(req, res){
async.waterfall([
searchTeam,
searchPlayer
], function (err, teams, players) {
res.render('index',{
title:'Search Teams and Players',
teams: teams,
players: players
});
});
}
router.post('/search-tp', renderResults);
问题内容: 有没有办法在单个函数调用上做到这一点? 就像是: 我知道这是一个语法混乱,但是只是为了给我一个我想实现的目标一个思路,一系列路由就很棒了! 有人知道怎么做吗? 问题答案: 我在寻找相同功能时遇到了这个问题。 @Jonathan Ong在上面的评论中提到,不建议将数组用于路径,但已在Express 4中对其进行了明确描述,并且它在Express 3.x中有效。这是尝试的示例: 从对象内部
Im正在尝试返回目录中的文件列表。有谁能帮忙吗?
问题内容: 基本路线是这样的: 是否可以命名该路由并在任何模板中使用它,以便可以像这样使用它: 灵感来自Django :) 问题答案: 没有开箱即用的机制。但是,您可以模仿Django的样式:定义文件,该文件将包含URL数组。首先开始: myviews.js urls.js 现在在 app.js (或任何主文件)中,您需要将URL绑定到Express。例如这样: app.js 现在,您可以定义自定
我在Angular2中有一个组件托管用户表(userTableComponnent)和另一个userDetails组件。单击用户表中的行后,我想路由到用户详细信息。一种实现是仅传递 userId,因此在 userDetails 中,我使用另一个 http get 获取用户的详细信息。但是,这是多余的,因为我在userTableComponent中获取了所有用户信息。因此,我真正需要的是将 User
问题内容: 伙计们,我只是花了很多时间来尝试查找-我应该缺少一些基本知识。 我有一个python对象,我要做的就是将此对象插入mondodb中。 这就是我所拥有的: 抛出此错误: 好像是因为json.dumps()返回一个字符串。 现在,如果我在插入之前对值进行加载,则效果很好: 最直接的方法是什么? 谢谢! 问题答案: 是什么在你最初的代码? 它不应该是类实例 这应该工作:
我对Node.js相当陌生,对Javascript也相当陌生(我不把使用jQuery的简单动画算作js)。作为一名Web开发人员,我正在从PHP/MySQL转向Express/Mongo。 我喜欢事物整洁的想法--只要在性能上没有明显的损失。由于node是如此快速的发展,我发现很难找到具体的意见和答案,我的路由方法为当前版本的node(我发现的大多数帖子似乎是不相关的,并已超过两年)。 我使用bl