javascript - another - En Node.js/Express, ¿cómo agrego automáticamente este encabezado a cada respuesta de "renderización"?
post express node (6)
Me gustaría señalar que ninguna de estas respuestas realmente responde la pregunta; la pregunta se relaciona específicamente con las respuestas de representación; por ejemplo, para una aplicación como:
const router = require(''express'').Router();
router.use(''/test.json'', (req, res) => res.json({ test: ''hi'' });
router.use(''/test.html'', (req, res) => res.render(''test''));
No está claro cómo agregar encabezados (por ejemplo, encabezados CSP, que pueden ser muy detallados) solo a sus respuestas HTML. Express no tiene un gancho para hacerlo específicamente. La única opción en este momento es organizar su código para que no tenga que hacerlo, por ejemplo
app.use(jsonRouter);
app.use(htmlRouter);
... que le permite hacer lo que sugieren algunas de las otras respuestas, y agregar middleware genérico para configurar los encabezados.
Tengo muchos de estos "controladores":
app.get(''/'',function(req,res){
var stuff = { ''title'': ''blah'' };
res.render(''mytemplate'',stuff);
});
Aviso res.render? Quiero agregar este encabezado a cada encabezado de respuesta que hago:
X-XSS-Protection: 0
¿Cómo puedo agregar ese encabezado de respuesta automáticamente?
Me parece que otro buen lugar para inyectar encabezados predeterminados es durante el Middleware de enrutamiento. De esta forma, todas las rutas controladas por la instancia del enrutador recibirán los encabezados.
Por ejemplo:
//...
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
// ...
});
Para express 4.x, la forma idiomática es la siguiente:
Implementación
// no mount path; executed for every request.
app.use(function (req, res, next) {
res.set(''X-XSS-Protection'', 0);
next();
});
Prueba
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);
});
});
Dependencias del desarrollador (para que las pruebas funcionen)
% npm install --save-dev mocha hippie
Documentación relevante
Probablemente desee utilizar app.use con su propio middleware:
app.use(function(req, res, next) {
res.header(''X-XSS-Protection'', 0);
next();
});
podrías crear tu propio método de middleware así:
addToHeader = function (req, res, next) {
console.log("add to header called ... " + req.url);
res.header(''X-XSS-Protection'', ''0'');
next();
}
y luego cambia tus rutas a algo como esto:
app.get(''/'', addToHeader, function(req,res){
var stuff = { ''title'': ''blah'' };
res.render(''mytemplate'',stuff);
});
Deberia trabajar.
// global controller
app.get(''/*'',function(req,res,next){
res.header(''X-XSS-Protection'' , 0 );
next(); // http://expressjs.com/guide.html#passing-route control
});
Solo asegúrese de que este sea el primer controlador que agregue, el orden es significativo.