在Node.js / Express中,如何自动将此标题添加到每个“渲染”响应中?

时间:2011-07-12 08:04:24

标签: javascript node.js http express url

我有很多这样的“控制器”:

app.get('/',function(req,res){
    var stuff = { 'title': 'blah' };
    res.render('mytemplate',stuff);
});    

注意res.render?我想将此标题添加到我创建的每个响应标头中:

X-XSS-Protection: 0

如何自动添加该响应标头?

7 个答案:

答案 0 :(得分:69)

您可能希望将app.use与您自己的中间件一起使用:

app.use(function(req, res, next) {
    res.header('X-XSS-Protection', 0);
    next();
});

答案 1 :(得分:65)

// global controller
app.get('/*',function(req,res,next){
    res.header('X-XSS-Protection' , 0 );
    next(); // http://expressjs.com/guide.html#passing-route control
});

确保这是您添加的第一个控制器,订单很重要。

答案 2 :(得分:10)

对于express 4.x,惯用法如下:

实施

// no mount path; executed for every request.
app.use(function (req, res, next) {
  res.set('X-XSS-Protection', 0);
  next();
});

测试

describe('Response Headers', function () {
  it('responds with header X-XSS-Protection: 0', function (done) {
    hippie(app)
    .get('/any/route/you/can/think/of')
    .expectHeader('X-XSS-Protection', 0)
    .end(done);
  });
});

Dev Dependencies(用于测试工作)

% npm install --save-dev mocha hippie

相关文件

答案 3 :(得分:7)

您可以像这样创建自己的中间件方法:

addToHeader = function (req, res, next) {
  console.log("add to header called ... " + req.url);
  res.header('X-XSS-Protection', '0');
  next();
}

然后将您的路线更改为......:

app.get('/', addToHeader, function(req,res){
  var stuff = { 'title': 'blah' };
  res.render('mytemplate',stuff);
});

应该有用。

答案 4 :(得分:3)

我发现在路由中间件期间注入默认标头的另一个好地方。这样,路由器实例控制的所有路由都将接收标头。

例如:

//...
var router = express.Router();

// middleware for all routes
router.use(function(req, res, next) {
  // inject default headers
  res.header('cache-control', 'private, max-age=0');
  res.header('expires', new Date(Date.now()).toUTCString());
  next();
});

// all routes below will now inherit 
// the middleware's default headers
router.get('/users', function(req, res){
   // I will return the user list, with default headers
   // ...
});

答案 5 :(得分:1)

我想指出这些答案都没有真正回答这个问题;这个问题具体涉及渲染回应;例如对于像这样的应用程序:

const router = require('express').Router();
router.use('/test.json', (req, res) => res.json({ test: 'hi' });
router.use('/test.html', (req, res) => res.render('test'));

目前尚不清楚如何向HTML回复添加标题(例如,CSP标题,这可能非常详细)。 Express并没有特别注意这一点。目前唯一的选择是组织您的代码,以便您不必,例如

app.use(jsonRouter);
app.use(htmlRouter);

...允许您像其他一些答案一样建议,并添加通用中间件来设置标题。

答案 6 :(得分:0)

使用middleware ...

app.use(app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next()
}))

但是请确保在API方法之前使用使用它。像这样:

const app = express()

// middleware
app.use(app.use(function (req, res, next) {
  res.header("Access-Control-Allow-Origin", "*")
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept")
  next()
}))

// api
app.get('/user', (req, res, next) => {
  service.doSomething
    .then(data => res.send(data))
    .catch(next)
})

app.use(handleError)

花点时间找出答案。我没有在任何地方看到它,因此添加了它以补充先前的答案。