Следите за мной (@troygoode) в Твиттере!
Установка
Это модуль для Node.js, доступный через реестр npm. Установка выполняется с помощью команды npm install:
npm install cors
Использование
Простое использование (включить все CORS-запросы)
var express = require('express')
var cors = require('cors')
var app = express()
app.use(cors())
app.get('/products/:id', function (req, res, next) {
res.json({msg: 'CORS включен для всех источников!'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Включить CORS для одного маршрута
var express = require('express')
var cors = require('cors')
var app = express()
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'CORS включен для одного маршрута'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Настройка CORS
var express = require('express')
var cors = require('cors')
var app = express()
var corsOptions = {
origin: 'http://example.com',
optionsSuccessStatus: 200 // некоторые старые браузеры (IE11, различные SmartTV) не поддерживают 204
}
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({msg: 'CORS включен только для example.com.'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Настройка CORS с динамическим источником
Этот модуль поддерживает проверку источника динамически с использованием функции, предоставленной в опции origin
. Эта функция получает строку, которая является источником (или undefined
, если запрос не имеет источника), и callback
с подписью callback(error, origin)
.
var express = require('express')
var cors = require('cors')
var app = express()
var corsOptions = {
origin: function (origin, callback) {
// db.loadOrigins - это пример вызова для загрузки
// списка источников из базы данных
db.loadOrigins(function (error, origins) {
callback(error, origins)
})
}
}
app.get('/products/:id', cors(corsOptions), function (req, res, next) {
res.json({msg: 'CORS включен для разрешенного домена.'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Включение предварительного запроса CORS
Некоторые CORS-запросы считаются "сложными" и требуют начального запроса OPTIONS
(называемого "предварительным запросом"). Примером "сложного" CORS-запроса является запрос, использующий HTTP-глагол, отличный от GET/HEAD/POST (например, DELETE) или использующий пользовательские заголовки. Чтобы включить предварительный запрос, необходимо добавить новый обработчик OPTIONS
для маршрута, который вы хотите поддерживать:
var express = require('express')
var cors = require('cors')
var app = express()
app.options('/products/:id', cors()) // включить предварительный запрос для запроса DELETE
app.del('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'CORS включен для всех источников!'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Вы также можете включить предварительный запрос для всех маршрутов следующим образом:
app.options('*', cors()) // включить перед другими маршрутами
ПРИМЕЧАНИЕ: При использовании этого промежуточного ПО на уровне приложения (например, app.use(cors())
), предварительные запросы уже обрабатываются для всех маршрутов.
Асинхронная настройка CORS
var express = require('express')
var cors = require('cors')
var app = express()
var allowlist = ['http://example1.com', 'http://example2.com']
var corsOptionsDelegate = function (req, callback) {
var corsOptions;
if (allowlist.indexOf(req.header('Origin')) !== -1) {
corsOptions = { origin: true } // отразить (включить) запрашиваемый источник в ответе CORS
} else {
corsOptions = { origin: false } // отключить CORS для этого запроса
}
callback(null, corsOptions) // callback ожидает два параметра: ошибка и опции
}
app.get('/products/:id', cors(corsOptionsDelegate), function (req, res, next) {
res.json({msg: 'CORS включен для разрешенного домена.'})
})
app.listen(80, function () {
console.log('Веб-сервер с поддержкой CORS слушает на порту 80')
})
Параметры конфигурации
origin
: Настраивает заголовок **Access-Control-Allow-Origin** CORS. Возможные значения:Boolean
- установитеorigin
вtrue
, чтобы отразить [источник запроса](http://tools.ietf.org/html/draft-abarth-origin-09), как определеноreq.header('Origin')
, или установите его вfalse
, чтобы отключить CORS.String
- установитеorigin
на конкретный источник. Например, если вы установите его на"http://example.com"
, будут разрешены только запросы с "http://example.com".RegExp
- установитеorigin
на регулярное выражение, которое будет использоваться для проверки источника запроса. Если это совпадение, источник запроса будет отражен. Например, шаблон/example\.com$/
отразит любой запрос, исходящий из источника, заканчивающегося на "example.com".Array
- установитеorigin
на массив допустимых источников. Каждый источник может бытьString
илиRegExp
. Например,["http://example1.com", /\.example2\.com$/]
примет любой запрос с "http://example1.com" или с поддомена "example2.com".Function
- установитеorigin
на функцию, реализующую некоторую пользовательскую логику. Функция принимает источник запроса в качестве первого параметра и callback (вызывается какcallback(err, origin)
, гдеorigin
- это значениеorigin
, не являющееся функцией) в качестве второго.
methods
: Настраивает заголовок **Access-Control-Allow-Methods** CORS. Ожидает строку, разделенную запятыми (например, 'GET,PUT,POST') или массив (например,['GET', 'PUT', 'POST']
).allowedHeaders
: Настраивает заголовок **Access-Control-Allow-Headers** CORS. Ожидает строку, разделенную запятыми (например, 'Content-Type,Authorization') или массив (например,['Content-Type', 'Authorization']
). Если не указано, по умолчанию отражает заголовки, указанные в заголовке **Access-Control-Request-Headers** запроса.exposedHeaders
: Настраивает заголовок **Access-Control-Expose-Headers** CORS. Ожидает строку, разделенную запятыми (например, 'Content-Range,X-Content-Range') или массив (например,['Content-Range', 'X-Content-Range']
). Если не указано, никакие пользовательские заголовки не отображаются.credentials
: Настраивает заголовок **Access-Control-Allow-Credentials** CORS. Установите вtrue
, чтобы передать заголовок, в противном случае он опускается.maxAge
: Настраивает заголовок **Access-Control-Max-Age** CORS. Установите целое число, чтобы передать заголовок, в противном случае он опускается.preflightContinue
: Передает ответ на предварительный запрос CORS следующему обработчику.optionsSuccessStatus
: Предоставляет код состояния для успешных запросовOPTIONS
, так как некоторые старые браузеры (IE11, различные SmartTV) не поддерживают204
.
Демо
Демо, иллюстрирующее работу CORS (и его отсутствие) с использованием React, доступно здесь: https://node-cors-client.netlify.com
Код для этого демо можно найти здесь: