问题描述
我正在使用ElasticSearch运行Express.js / Node.js应用程序。我试图在同一个索引中查看多个类型的结果。我在这里做的是运行搜索查询,并根据查询的结果执行第二个搜索查询。我可以看到弹性搜索返回的结果为玩家也通过观察node.js控制台。但是它们没有被插入到我的结果对象/数组中。我正在使用快速中间件,因为我必须执行两个搜索和显示结果。routes / 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();
}
函数renderResults(req,res){
res.render('index',{
title:'搜索团队和玩家',
团队:req.teams,
玩家:req.players
});
}
router.post('/ search-tp',searchTeam,searchPlayer,renderResults);
我通过阅读和。我可以显示团队阵列。但是没有来自球员阵列。我在这里做错了什么。
在你的 searchPlayer
函数应该将 next()
调用放在由 searchPlayers()
调用的回调内,基本上完全符合你所做的
function searchTeam(req,res,接下来){
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);< --- ...否则这将失败
next();< ---移动下一个()here
});
});
}
函数renderResults(req,res){
res.render('index',{
title:'搜索团队和玩家',
团队:req.teams,
玩家:req.players
});
}
router.post('/ search-tp',searchTeam,searchPlayer,renderResults);
根据Talha Awan的建议,您最好不要在中间件中使用,而是使用专用的库,像 async
一个
从'异步/瀑布'导入瀑布;
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);
});
}
函数renderResults(req,res){
async.waterfall([
searchTeam,
searchPlayer
],function(err ,球队,球员){
res.render('index',{
title:'搜索队和球员',
队:球队,
球员:球员
});
});
}
router.post('/ search-tp',renderResults);
I am running Express.js/Node.js application with ElasticSearch. I am trying to view results from multiple types in the same index. What I do here is run a search query and based the results of the query second search query executes. I can see that elasticsearch return results for players also by observing the node.js console. But they are not inserted to my results object/array. I am using express middleware since I have to execute two search and display results as one.
routes/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);
I came up with this solution by reading post1 and post2. I can display the teams array. But nothing comes from the players array. What am I doing incorrect in here.
In your searchPlayer
function, the next()
call should be placed inside the callback called by searchPlayers()
, basically exactly what you did for the searchTeam()
function.
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);
And as suggested by Talha Awan, you should preferably not do this in middleware but using a dedicated library, like the async
one (but there are tons of others)
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);
这篇关于在express.js路由中将多个结果插入到req对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!