ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[TOC] # cors CORS是一个node.js包,用于提供可用于启用各种选项的CORS的Connect / Express中间件。 <br> <br> ## 所有请求启用CORS ~~~ var cors = require('cors') app.use(cors()) ~~~ <br> ## 为单个路由启用CORS ~~~ var cors = require('cors') app.get('/products/:id', cors(), function (req, res, next) { res.json({msg: 'This is CORS-enabled for a Single Route'}) }) ~~~ <br> ## 白名单/动态路由 ~~~ var express = require('express') var cors = require('cors') var app = express() var whitelist = ['http://example1.com', 'http://example2.com'] var corsOptions = { origin: function (origin, callback) { if (whitelist.indexOf(origin) !== -1) { callback(null, true) } else { callback(new Error('Not allowed by CORS')) } } } app.get('/products/:id', cors(corsOptions), function (req, res, next) { res.json({msg: 'This is CORS-enabled for a whitelisted domain.'}) }) ~~~ <br> ## 预检 某些CORS请求被认为是“复杂的”并且需要初始OPTIONS请求(称为“pre-flight请求”)。 “复杂”CORS请求的示例是使用除GET / HEAD / POST之外的HTTP动词(例如DELETE)或使用自定义标头的请求。 要启用pre-flight,您必须为要支持的路由添加新的OPTIONS处理程序: ~~~ app.options('/products/:id', cors()) // enable pre-flight request for DELETE request app.del('/products/:id', cors(), function (req, res, next) { res.json({msg: 'This is CORS-enabled for all origins!'}) }) ~~~ 也可以这样允许所有预检 ~~~ app.options('*', cors()) // include before other routes ~~~ <br> ## 配置 * origin 配置 Access-Control-Allow-Origin CORS header。 可能的值: * Boolean - 将origin设置为true以反映请求源,由req.header('Origin')定义,或将其设置为false以禁用CORS * String - 将origin设置为指定的origin * RegExp * Array - 将原点设置为有效原点的数组。每个orgin可以是String或RegExp。 * Function - 将orgin设置为自定义函数。该函数将请求源作为第一个参数,并将回调函数(signature err [object], allow [bool])作为第二个参数。 * 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 header 中指定的header。 * exposedHeaders 配置Access-Control-Expose-Headers CORS头。 以逗号分隔的字符串(例如:'Content-Range,X-Content-Range')或数组(例如:''Content-Range','X-Content-Range'])。 如果未指定,则不会添加自定义header。 * credentials 配置Access-Control-Allow-Credentials CORS标头。 设置为true则传递到header,否则将被省略。 * maxAge 配置Access-Control-Max-Age CORS头。 设置为整数以传递header,否则将省略。 * preflightContinue 将CORS预检响应传递给下一个处理程序。 * optionsSuccessStatus: 提供用于成功OPTIONS请求的状态代码,因为某些旧版浏览器会阻塞204。(IE11,各种智能电视) <br> ## 默认配置 ~~~ { "origin": "*", "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", "preflightContinue": false, "optionsSuccessStatus": 204 } ~~~