【问题标题】:res.send not getting executed in the middleware in expressres.send 没有在 express 的中间件中执行
【发布时间】:2016-12-10 16:34:50
【问题描述】:

我想做的是修改响应正文。

为此,我使用了一个在每次请求时都会调用的中间件。 为了实现它,我从 github https://github.com/ccoenraets/nodecellar 获取了一个演示应用程序。我在 server.js 中添加了一个中间件,类似于express logging response body 上给出的示例。

我仍然无法修改响应正文,因为 res.send = function (string) 没有被调用。

下面提到的是代码。请让我知道我在这里做错了什么。

 var express = require('express'),
path = require('path'),
http = require('http'),
wine = require('./routes/wines');

var app = express();
app.configure(function () {
    app.set('port', process.env.PORT || 4000);
    app.use(express.logger('dev'));  /* 'default', 'short', 'tiny', 'dev' */
    app.use(express.bodyParser()), 
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(logResponseBody);
});

app.get('/wines', wine.findAll);
app.get('/wines/:id', wine.findById);
app.post('/wines', wine.addWine);
app.put('/wines/:id', wine.updateWine);
app.delete('/wines/:id', wine.deleteWine);
http.createServer(app).listen(app.get('port'), function () {
    console.log("Express server listening on port " + app.get('port'));
    });
 function logResponseBody(req,res,next){
 var send = res.send; 
 console.log("send resp is: "+send);
 res.send = function (string) {
 var body = string instanceof Buffer ? string.toString() : string;
   console.log("Body found is: "+body);
   body = body.replace(/<\/head>/, function (w) {
   return 'Modified head' + w;
  });
 send.call(this, body);
 }; 
 res.on('finish', function(){
console.log("Finished " + res.headersSent); // for example
console.log("Finished " + res.statusCode);  // for example
})
next();
} 

PS:我正在为类似的问题创建一个新线程,因为我的声望低于 50。因此无法在此处添加 cmets。

【问题讨论】:

    标签: node.js express middleware


    【解决方案1】:

    将中间件添加到 express 应用程序的最佳方法是使用 app.use 方法,因此您可以删除整个 http.createServer 块并将其替换为类似的东西

    app.use(function(req, res, next) {
      //do everything you want to happen on every request
      next();
    });
    
    app.listen(app.get('port'), function() {
      console.log('listening on port ' + app.get('port'));
    });
    

    有关 app.use 的更多信息,请查看the express app use documentation

    【讨论】:

    • 我已经尝试使用 app.listen 而不是 http.listen 但它仍然无法正常工作。
    • 这里重要的是把listen方法中回调的内容取出来放到app.use方法中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多