node.js - 在发送给客户端之前劫持响应

标签 node.js express

我有以下代码用作中间件

module.exports=function(callback) {
    callbacks.push(callback);
    return function(req,res,next) {
        if (!res.hijacked) {
            res.hijacked=true;
        } else {
            return next();
        }
        var send=res.send;
        res.send=function(data) {
            var body=data instanceof Buffer ? data.toString() : data;
            var requests=[];
            requests.push(function(next) {
                 callbacks[0](req,res)(body,doneWrapper(body,next));
            });
            for (var i=1;i<callbacks.length;i++) {
                var hijackCallback=callbacks[i];
                requests.push(function(result,next) {
                    hijackCallback(req,res)(result,doneWrapper(result,next));
                });
            }
            var that=this;
            async.waterfall(requests,function(err,result) {
                send.call(that,result);
                requests=null;
                body=null;
                that=null;
            });
        };
        next();
    };
};

使用示例如下:

module.exports=function() {
    return hijack(function() {
        return function(result,done) {
            var json={};
            try {
                json=JSON.parse(result);
            } catch(e) {
                return done();
            }
            if (!_.isArray(json)) {
                return done();
            }
            var sorted=_(json).sortBy(function(item) {
                if (_.isObject(item.information)) {
                    return item.information.rangeIndex1 || 999;
                } else {
                    return 1001;
                }
            });
            done(sorted);
        }
    });
};

它最初作为路由中的中间件工作得很好。

但是,当我尝试将其设置为 app.use(hijackMiddleware()) 时。出了点问题,我收到了发送后无法设置 header 错误。

不过,在路由中用作中间件时没有问题。

最佳答案

您是否考虑过使用 express-interceptor ?真的很容易use :

var express     = require('express');
var cheerio     = require('cheerio');
var interceptor = require('express-interceptor');

var app = express();

var finalParagraphInterceptor = interceptor(function(req, res){
  return {
    // Only HTML responses will be intercepted
    isInterceptable: function(){
      return /text\/html/.test(res.get('Content-Type'));
    },
    // Appends a paragraph at the end of the response body
    intercept: function(body, send) {
      var $document = cheerio.load(body);
      $document('body').append('<p>From interceptor!</p>');

      send($document.html());
    }
  };
})

// Add the interceptor middleware
app.use(finalParagraphInterceptor);

app.use(express.static(__dirname + '/public/'));

app.listen(3000);

关于node.js - 在发送给客户端之前劫持响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29905290/

相关文章:

node.js - lambda 触发器回调 vs context.done

javascript - 重新格式化日期正则表达式

javascript - Async.series 不适用于 fs.readFile

javascript - 在 express.js 中发布表单数据后如何防止重定向?

node.js - 在 Webstorm 2017.1.3/Ubuntu 16.04 LTS 中安装 npm 包

javascript - Angular JS 教程 - 需要澄清

node.js - 在heroku上部署Nodejs+Express+React+Webpack应用程序

Javascript 文档未加载

node.js - 从 ejs 模板访问 localStorage

javascript - Node.js 从 json 创建模型对象