В Node.js/Express, как я могу автоматически добавить этот заголовок в каждый ответ "render"?
У меня есть многие из этих "контроллеров":
app.get('/',function(req,res){
var stuff = { 'title': 'blah' };
res.render('mytemplate',stuff);
});
Обратите внимание на res.render? Я хочу добавить этот заголовок в каждый заголовок ответа, который я делаю:
X-XSS-Protection: 0
Как я могу добавить заголовок ответа автоматически?
Ответы
Ответ 1
// global controller
app.get('/*',function(req,res,next){
res.header('X-XSS-Protection' , 0 );
next(); // http://expressjs.com/guide.html#passing-route control
});
Просто убедитесь, что это первый контроллер, который вы добавляете, порядок значим.
Ответ 2
Вероятно, вы захотите использовать app.use со своим собственным промежуточным программным обеспечением:
app.use(function(req, res, next) {
res.header('X-XSS-Protection', 0);
next();
});
Ответ 3
Для выражения 4.x идиоматический способ выглядит следующим образом:
Реализация
// 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);
});
});
Dev Dependencies (для тестирования работы)
% npm install --save-dev mocha hippie
Соответствующая документация
Ответ 4
вы могли бы создать свой собственный метод промежуточного слоя, например:
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);
});
должен работать.
Ответ 5
Я обнаружил, что еще одно хорошее место для ввода заголовков по умолчанию - во время промежуточного ПО Routing Middleware. Таким образом, все маршруты, управляемые экземпляром маршрутизатора, получат заголовки.
Например:
//...
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 default headers
router.get('/users', function(req, res){
// I will return the user list, with default headers
// ...
});
Ответ 6
Я хотел бы указать, что ни один из этих ответов не отвечает на вопрос; вопрос конкретно связан с оказанием ответов; например для приложения вроде:
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);
..., который позволяет вам сделать, как предлагают некоторые другие ответы, и добавить общее промежуточное программное обеспечение для настройки заголовков.
Ответ 7
Используйте промежуточное ПО...
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)
Мне понадобилось время, чтобы понять это. Я нигде не упоминал об этом, поэтому добавляю это, чтобы дополнить предыдущие ответы