【问题标题】:before and after hooks for a request in express (to be executed before any req and after any res)express 请求的 before 和 after 钩子(在任何 req 之前和任何 res 之后执行)
【发布时间】:2013-12-09 03:50:18
【问题描述】:

ExpressJS 中间件 req、res、next 有像 .on 和 .pipe 这样的钩子。

但我正在寻找 app.get 和 app.post 方法的挂钩。

【问题讨论】:

    标签: node.js express


    【解决方案1】:

    app.use() and middleware 可用于“before”,'close' 和 'finish' 事件的组合可用于“after”。 p>

    app.use(function (req, res, next) {
        function afterResponse() {
            res.removeListener('finish', afterResponse);
            res.removeListener('close', afterResponse);
    
            // action after response
        }
    
        res.on('finish', afterResponse);
        res.on('close', afterResponse);
    
        // action before request
        // eventually calling `next()`
    });
    
    app.use(app.router);
    

    logger middleware 就是一个例子,默认情况下它会在响应之后附加到日志中。

    只需确保在app.router 之前使用此“中间件”,因为顺序很重要。

    【讨论】:

    • 这也很有趣,logger 同时监听 close 和 finish。据说这在某些情况下很有用。
    • @vkurchatkin 两者都使用有助于向后兼容,因为 'finish' 是 Node 0.10 和 Streams2 的新功能。因此,Express 也使用'close' 来支持较低版本的 Node。
    • 嗯,不要这么认为:nodejs.org/api/http.html#http_event_close_1,nodejs.org/api/stream.html#stream_event_finish。如果在res.end() 调用之前终止连接并且在res.send() 之后发出finish,则看起来像close 被发出
    • @vkurchatkin 实际上两者兼而有之。请注意,我没有链接到最新版本的文档,因为'finish' 事件在v0.10.0 之前的稳定版本中不存在。在此之前,两种情况都会发出'close' 事件——http.ServerResponse (v0.8.26) 和Writable Stream (v0.8.26)。但是,你说得对,'close' 不仅仅是为了向后支持,我已经对其进行了编辑。
    • 是否需要移除监听器?当响应完成时,它自己和监听器都不会被再次使用,还是会?
    猜你喜欢
    • 2016-01-01
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多