所以,我有这样的设置(在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
});
答案 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!');
});