В Node.js / Express как автоматически добавить этот заголовок к каждому ответу «рендеринга»? - PullRequest
32 голосов
/ 12 июля 2011

У меня много таких «контроллеров»:

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

Обратите внимание, res.render? Я хочу добавить этот заголовок к каждому создаваемому мной заголовку ответа:

X-XSS-Protection: 0

Как автоматически добавить этот заголовок ответа?

Ответы [ 7 ]

70 голосов
/ 05 июля 2013

Возможно, вы захотите использовать app.use со своим собственным промежуточным программным обеспечением:

app.use(function(req, res, next) {
    res.header('X-XSS-Protection', 0);
    next();
});
65 голосов
/ 12 июля 2011
// global controller
app.get('/*',function(req,res,next){
    res.header('X-XSS-Protection' , 0 );
    next(); // http://expressjs.com/guide.html#passing-route control
});

Просто убедитесь, что это первый добавленный контроллер, порядок значительный.

11 голосов
/ 05 декабря 2014

Для экспресс 4.х, идиоматический способ выглядит следующим образом:

Осуществление

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

Test

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);
  });
});

Зависимости разработчиков (для тестов на работу)

% npm install --save-dev mocha hippie

Соответствующая документация

7 голосов
/ 12 июля 2011

вы можете создать свой собственный метод промежуточного программного обеспечения, например, так:

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

и затем изменить ваши маршруты на sth следующим образом:

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

должно работать.

3 голосов
/ 12 сентября 2015

Я считаю, что еще одним хорошим местом для вставки заголовков по умолчанию является промежуточное программное обеспечение маршрутизации.Таким образом, все маршруты, контролируемые экземпляром маршрутизатора, получат заголовки.

Например:

//...
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
   // ...
});
1 голос
/ 13 мая 2019

Используйте связующее ПО ...

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(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)

Мне понадобилось время, чтобы понять это. Я нигде не упоминал об этом, поэтому добавил это, чтобы дополнить предыдущие ответы.

1 голос
/ 26 июля 2016

Я хотел бы отметить, что ни один из этих ответов на самом деле не отвечает на вопрос;вопрос конкретно касается предоставления ответов;например, для такого приложения, как:

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

Непонятно, как добавить заголовки (например, заголовки CSP, которые могут быть очень многословными) только к вашим HTML-ответам.Экспресс не имеет крючка, чтобы специально сделать это.Единственный вариант на данный момент - это организовать ваш код так, чтобы вам не приходилось, например,

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

..., что позволяет вам делать то, что предлагают другие ответы, и добавлять общее промежуточное ПО дляустановка заголовков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...