我想要做的是修改响应正文。
为此我使用的是一个在每次请求时调用的中间件。 为了实现它,我从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。因此无法在那里添加评论。
答案 0 :(得分:0)
将中间件添加到快速应用程序的最佳方法是使用app.use方法,这样您就可以删除整个http.createServer块并将其替换为类似
的内容var myModule = (function(){
var public = {
obj: {},
updateObj: function(newObj) {
public.obj = newObj;
}
}
return public;
}())
有关app.use的更多信息,请查看the express app use documentation。