在Express或与Node.js连接,有没有办法在内部调用另一个路由?

时间:2012-02-28 00:52:34

标签: node.js routes express

所以,我有这样的设置(在Express中):

app.get('/mycall1', function(req,res) { res.send('Good'); });
app.get('/mycall2', function(req,res) { res.send('Good2'); });

如果我想制作一个聚合函数来调用/mycall1/mycall2而不重写代码并重用/mycall1/mycall2的代码会怎样?

例如:

app.get('/myAggregate', function (req, res) {
  // call /mycall1
  // call /mycall2  
});

2 个答案:

答案 0 :(得分:7)

不,如果不重写或重构代码,这是不可能的。原因是res.send actually calls res.end after it is done writing。这样就结束了回应,没有更多的东西可以写出来了。

正如您所暗示的那样,您可以通过重构代码来实现所需的效果,以便/mycall1/mycall2在内部调用单独的函数,/myAggregate调用这两个函数。

在这些功能中,您必须使用res.write来阻止结束响应。 /mycall1/mycall2/myAggregate的处理程序必须分别调用res.end才能实际结束响应。

答案 1 :(得分:0)

与javascript中的许多事情一样,您的原始目标可以通过 snakiness 来实现。我们可以覆盖res.send函数,使其不调用res.end;这将允许res.send被多次调用而不会出现问题。请注意,这是一种丑陋的,偷偷摸摸的方法-不建议使用,但可能有用:

app.get('myAggregate', (req, res) => {
  // Overwrite `res.send` so it tolerates multiple calls:
  let restoreSend = res.send;
  res.send = () => { /* do nothing */ };

  // Call mycall1
  req.method = 'GET';
  req.url = '/mycall1';
  app.handle(req, res, () => {});

  // Call mycall2
  req.method = 'GET';
  req.url = '/mycall2';
  app.handle(req, res, () => {});

  // Restore `res.send` to its normal functionality
  res.send = restoreSend;

  // Finally, call `res.send` in conclusion of calling both mycall1 and mycall2
  res.send('Good AND Good2!');

});