在express.js路由中插入多个结果到req对象

Inserting multiple results to req object in express.js route

本文关键字:结果 req 对象 插入 express js 路由      更新时间:2023-09-26

我正在使用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);