[英]Express.js: How to pass req object to middleware w/o creating a new route w/ Multer
[英]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提出了這個解決方案。 我可以顯示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);
而且正如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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.