我的问题恰好是this。问题是,当我将解决方案应用于该问题时,什么也没发生-res.send的值未记录。 我使用Express 4.16.4。
这是我的代码:
/* FILE: /app.js: */
...
const postRoute = require('./middleware/postRoute');
const myRoute = require('./routes/myRoute');
...
app.use('/', myRoute);
app.use(postRoute);
...
/* FILE: /routes/myRoute */
...
router.post('/myRoute', [], (req, res, next) => {
res.send({ status:'success', message:'Test success. Feels good, man.' });
next();
});
...
/* FILE: /middleware/postRoute */
const postRoute = function(req, res, next) {
console.log('postRoute: ');
var send = res.send;
res.send = function(chunk, encoding){
res.send = send;
if (chunk) {
console.log('postRoute chunk: ', chunk); // This statement is never reached
}
res.send(chunk, encoding);
};
next();
};
module.exports = { postRoute };
当我使用邮递员向POST
发出/myRoute
请求时,它会记录以下内容:postRoute:
就是这样。永远不会到达第二个console.log()
,并且可能与function()
在同一console.log()
中的其他任何语句也不会到达。
在问题开始时我链接到的问题是2015年,当时我假设他们使用的Express.js版本不同,这就是为什么他们的解决方案对我不起作用的原因?在我的中间件代码示例中,我使用了与该问题的答案之一相关联的问题代码,因为该解决方案对我不起作用。但是该解决方案显然也不起作用,否则我不会在这里-这是从2012年开始的!谁甚至不知道他们当时使用的Express版本!?
因此,我要重申并总结我的问题:如何使用中间件记录传递给res.send()
的值?
跟进问题(但让我知道是否宁愿在另一个问题中问这个问题):有没有一种方法可以在路由/响应之后从路由而不是全局调用中间件。因此,router.post('/myRoute', [postRoute], (req, res, next) => {...});
而非app.use(postRoute)
?
答案 0 :(得分:0)
这就是我最终要做的。我保持文件结构完全相同,但是没有将res.send()
从路由中删除,而是将本应发送的对象附加到res
对象,然后在我路线的尽头。因此,例如,next()
成为res.send({message:'blah'});
。我之所以使用res.return = {message:'blah'}; next();
是因为我不相信默认情况下.return
对象上存在这样的属性,并且我发现该属性足以描述我的目的。然后,在我的res
中间件中,我可以轻松访问postRoute
,然后调用res.return
。
使用我的问题示例(return res.send(res.return)
与您看到的完全一样):
app.js
/* FILE: /routes/myRoute */
...
router.post('/myRoute', [], (req, res, next) => {
if(theConditionIsMet()) {
res.return = { message:'The condition was met.' };
} else {
res.return = { message:'The condition was not met.' };
}
next();
});
....
router.post('/anotherRoute', [], (req, res, next) => {
// In this route I don't need to intercept the response, so I just do it like normal.
return res.send({ message:'Feels good, man.' });
});
...
我已经看到的一个缺陷是,我现在必须重组所有路由以使用这种/* FILE: /middleware/postRoute */
const postRoute = function(req, res, next) {
if(res.hasOwnProperty('return') {
return res.send(res.return);
}
};
module.exports = { postRoute };
ing方法(或至少要截取返回值的所有路由) 。因此,并且因为我认为比我更博学的人可能会找到一种更好的方法,所以我不会接受自己的答案。