express 使用cors中间件解决跨域
# 概要
做一个公共的接口平台,需要提供接口给其他web使用,默认存在跨域问题
# 分析
因浏览器脚本安全策略影响,存在跨域,需要做处理, 这里采用cors方案解决跨域
技术栈:nodejs + express
# 解决
# 简单解决
使用cors第三方模块
npm install cors --save
var cors = require('cors');
app.use(cors());
注意,这个代码一定要写在注册路由的前面。此模块也可以,当做路由中间件,指定某一个,或者某一部分路由,拥有跨域功能。
# 中间件+可配置方案解决
- 开发中间件
import * as config from 'fd-config';
import { Request, Response, NextFunction } from 'express';
const cors = config.get('cors');
const NODE_ENV = config.get('NODE_ENV');
/**
* 允许跨域请求的中间件
* @param {Request} req
* @param {Response} res
* @param {NextFunction} next
*/
export default function(req: Request, res: Response, next: NextFunction) {
if (!cors || !cors.enable) return next();
const origin = req.get('origin') || '';
// 本地开发模式下,允许当前访问的任意域
let allowOrigin = NODE_ENV === 'development' ? origin : '';
if (NODE_ENV === 'production') {
for (const o of cors.origins) {
// 匹配`*`通配符和指定域
if (o === '*' || o === origin) {
allowOrigin = o;
break;
}
// 匹配`*.domain.com`通配子域
if (new RegExp(`${o.replace('*', '')}$`).test(origin)) {
allowOrigin = origin;
break;
}
}
}
if (allowOrigin) {
res.header('Access-Control-Allow-Origin', allowOrigin);
res.header('Access-Control-Allow-Headers', cors.headers.join(','));
res.header('Access-Control-Allow-Methods', cors.methods.join(','));
res.header('Access-Control-Max-Age', cors.maxAge.toString());
res.header('Access-Control-Allow-Credentials', 'true');
}
next();
}
- 使用中间件
app.use(middleware);
app.use(route)
# 总结
熟悉使用中间件开发
上次更新: 2021/12/19, 18:05:42