CORS и Access-Control-Allow-Методы в Express.js?
У меня есть экспресс-приложение со многими маршрутами:
app.get('foo/bar', function(res, res, next) { ... });
app.post('foo/bar', function(res, res, next) { ... });
app.get('another/one/path', function(res, res, next) { ... }));
И мне нужно отправлять междоменные запросы AJAX в это приложение. Итак, мне нужно отправить правильные Access-Control-Allow-Methods на запросы OPTIONS. Например, если запрос OPTIONS 'foo/bar'
то заголовок Access-Control-Allow-Methods должен быть равен GET,POST
, Я вижу, что если я отправляю запрос OPTIONS в платформе Express, я уже получаю правильный список методов в теле ответа. Например, если я отправляю OPTIONS 'foo/bar'
Я получаю ответ с телом GET,POST
, Теперь я хочу отправить GET,POST
в Access-Control-Allow-Methods
заголовок тоже. Я пытаюсь найти простое решение, чтобы сделать это. Я не хочу добавлять опции маршрутов, потому что у меня уже есть более 200 маршрутов в приложении.
2 ответа
Простейшим решением было бы использовать cors
Пакет Npm.
var express = require('express')
, cors = require('cors')
, app = express();
app.use(cors());
Если вы хотите накатить свои собственные, это поможет вам начать.
app.use(function(req, res, next) {
var oneof = false;
if (req.headers.origin) { //req.headers.origin.match(/whateverDomainYouWantToWhitelist/g) ) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
oneof = true;
}
if (req.headers['access-control-request-method']) {
res.header('Access-Control-Allow-Methods', req.headers['access-control-request-method']);
oneof = true;
}
if (req.headers['access-control-request-headers']) {
res.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers']);
oneof = true;
}
if (oneof) {
res.header('Access-Control-Max-Age', 60 * 60 * 24 * 365);
}
// intercept OPTIONS method
if (oneof && req.method == 'OPTIONS') {
res.sendStatus(200);
} else {
next();
}
});