在express.js路由中将多个结果插入到req对象 [英] Inserting multiple results to req object in express.js route

查看:157
本文介绍了在express.js路由中将多个结果插入到req对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我通过阅读 post1 POST2 。我可以显示团队阵列。但是没有来自球员阵列。我在这里做错了什么。

解决方案

在你的 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对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆