Node.js环境从.env读取可信子域名配置CORS跨域白名单异常问题
问题根因
- 类型不匹配:CORS配置的
origins参数需要接收数组格式的允许域名列表,但你从process.env读取到的ALLOWED_ORIGINS是纯字符串,直接传入字符串会导致配置不生效。 - 可选小问题:你配置的域名中存在多余空格,且
https://wwww.site1.com多写了一个w,可能会导致预期内的域名被拦截。
修复方案
步骤1:调整.env配置(可选)
可以先把逗号后的空格去掉,避免后续处理冗余,保留空格也不会影响最终效果:
// .env file ALLOWED_ORIGINS=http://localhost:3001,http://localhost:3000,https://www.site1.com,https://www.site2.com
步骤2:修改server.ts中的读取逻辑
把读取到的字符串分割为数组,同时做格式清洗:
// server.ts file export default createServer = (container) => { const env = process.env.NODE_ENV // 分割字符串为数组,去除每个域名前后空格,过滤空值 const allowedOrigins = process.env.ALLOWED_ORIGINS ?.split(',') .map(origin => origin.trim()) .filter(Boolean) || [] const cors = Cors({ origins: allowedOrigins, allowedHeaders: [ 'access-control-allow-origin', 'authorization', 'Pragma', 'contact', ], exposeHeaders: [] }) }
补充适配说明
如果使用的是标准corsnpm包,参数名应为origin而非origins,如果上述修改后仍不生效可以调整参数名:
const cors = Cors({ origin: allowedOrigins, // 其余配置保持不变 })
更稳妥的动态校验写法
如果希望避免配置写错导致的异常,可以用函数式校验逻辑:
const cors = Cors({ origin: (origin, callback) => { // 允许没有origin的请求(比如postman调试),不需要可以删掉第一个判断 if (!origin || allowedOrigins.includes(origin)) { callback(null, true) } else { callback(new Error('Not allowed by CORS')) } }, // 其余配置保持不变 })
内容的提问来源于stack exchange,提问作者ghostagent151
相关产品推荐
相关产品推荐

