在express.js路由中插入多个结果到req对象
Inserting multiple results to req object in express.js route
我正在使用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得出了这个解决方案。我可以显示球队数组。但是没有任何东西来自玩家数组。我在这里做错了什么
在您的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);
根据Talha Awan的建议,最好不要在中间件中这样做,而是使用专用库,如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);
相关文章:
- 奇怪的Javascript结果
- Javascript(jQuery)给了我奇怪的结果
- JSONP请求返回结果,但也触发error_callback
- 如何在chrome扩展中存储数据/结果,以及如何使用setTimeout使其只被调用一次
- Javascript,输出结果后页面不断刷新
- 这是使用html快照和谷歌获取的预期结果吗?SEO/SPA
- 将地理编码结果转换为php变量以发布到mysql数据库
- AngularJS/HTML/Bootstrap元素用于动态搜索结果
- JQuery:向多个匹配结果添加换行符的最简单方法
- 当查询不在displayField中时,引导Ajax Typeahead不显示结果
- webpack代码拆分了handlerbs文件——结果是文件很大
- JavaScript循环无法正确计算/显示结果
- 相同的RegExp返回不同的结果-第一次是正确的结果,第二次是null
- Node.js使用Series函数(模式?)实现流控制时出现意外结果
- 试图将onChange函数作为道具传递给GrandChlidren,结果是TypeError:这是未定义的
- jQuery使用api获取typeform结果
- 根据条件检查数据库结果
- 什么'这是从第三个函数上的async 1st函数获得结果的更好方法
- Angular,表达式{{}}的结果没有插入到ng-click中
- 在express.js路由中插入多个结果到req对象