В Express или соединиться с Node.js, есть ли способ вызвать другой маршрут внутри? - PullRequest
6 голосов
/ 28 февраля 2012

Итак, у меня есть такая настройка (в 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 ]

7 голосов
/ 28 февраля 2012

Нет, это невозможно без переписывания или рефакторинга вашего кода.Причина в том, что res.send на самом деле вызывает res.end после того, как все закончено, записывая .Это завершает ответ, и больше ничего не может быть написано.

Как вы и намекнули, вы можете достичь желаемого эффекта, реорганизовав код так, чтобы и /mycall1, и /mycall2 вызывали отдельные функции внутри, а /myAggregate вызывает обе функции.

В этих функциях вам придется использовать res.write, чтобы предотвратить завершение ответа.Каждый из обработчиков /mycall1, /mycall2 и /myAggregate должен будет вызывать res.end отдельно для фактического завершения ответа.

0 голосов
/ 14 февраля 2019

Как и многие вещи в javascript, ваша первоначальная цель может быть достигнута с подлостью .Мы можем переписать функцию 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!');

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...