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();
    }
});
Другие вопросы по тегам