You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:00:05