Express.js-获取res.send值

时间:2019-01-16 18:07:17

标签: node.js express

我的问题恰好是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)

1 个答案:

答案 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方法(或至少要截取返回值的所有路由) 。因此,并且因为我认为比我更博学的人可能会找到一种更好的方法,所以我不会接受自己的答案。