J'ai plusieurs de ces "contrôleurs":
app.get('/',function(req,res){
var stuff = { 'title': 'blah' };
res.render('mytemplate',stuff);
});
Remarquez le rendu de la résolution? Je veux ajouter cet en-tête à chaque en-tête de réponse que je fais:
X-XSS-Protection: 0
Comment puis-je ajouter cet en-tête de réponse automatiquement?
// global controller
app.get('/*',function(req,res,next){
res.header('X-XSS-Protection' , 0 );
next(); // http://expressjs.com/guide.html#passing-route control
});
Assurez-vous simplement qu'il s'agit du premier contrôleur que vous ajoutez, l'ordre est important.
Vous voulez probablement utiliser app.use avec votre propre middleware:
app.use(function(req, res, next) {
res.header('X-XSS-Protection', 0);
next();
});
Pour express 4.x, la voie idiomatique est la suivante:
// 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);
});
});
% npm install --save-dev mocha hippie
vous pouvez créer votre propre méthode middleware comme ceci:
addToHeader = function (req, res, next) {
console.log("add to header called ... " + req.url);
res.header('X-XSS-Protection', '0');
next();
}
puis changez vos itinéraires en qc comme ceci:
app.get('/', addToHeader, function(req,res){
var stuff = { 'title': 'blah' };
res.render('mytemplate',stuff);
});
devrait marcher.
Je trouve qu'un autre bon endroit pour injecter des en-têtes par défaut est pendant le middleware de routage. De cette façon, toutes les routes contrôlées par l'instance de routeur recevront les en-têtes.
Par exemple:
//...
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
// ...
});
Utilisez un 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()
})
Mais assurez-vous de l'utiliser avant votre méthode API. Comme ça:
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)
Cela m'a pris un certain temps pour le comprendre. Je ne l'ai vu mentionné nulle part, donc l'ajouter pour compléter les réponses précédentes.
Je voudrais souligner qu'aucune de ces réponses ne répond réellement à la question; la question concerne spécifiquement le rendu des réponses; par exemple. pour une application comme:
const router = require('express').Router();
router.use('/test.json', (req, res) => res.json({ test: 'hi' });
router.use('/test.html', (req, res) => res.render('test'));
Il n'est pas clair comment ajouter des en-têtes (par exemple, des en-têtes CSP, qui peuvent être très verbeux) niquement à vos réponses HTML. Express n'a pas de crochet pour le faire spécifiquement. La seule option pour le moment est d'organiser votre code afin que vous n'ayez pas à le faire, par ex.
app.use(jsonRouter);
app.use(htmlRouter);
... qui vous permet de faire comme le suggèrent certaines des autres réponses, et d'ajouter un middleware générique pour définir les en-têtes.