Node.js EXPRESS和CORS存在问题-访问控制允许原始

Node.js EXPRESS和CORS存在问题-访问控制允许原始,node.js,express,cors,Node.js,Express,Cors,当我将一个url传递给我的Cors选项时,我的API将使用以下url返回Access Control Allow Origin: app.use(cors({ origin: 'https://fakeUrl.net/', optionsSuccessStatus: 200, })); 但当我传递列表时,express不会返回标题: var allowedOrigins = ['https://fakeUrl.net','https://fakeUrl2.net/']; a

当我将一个url传递给我的Cors选项时,我的API将使用以下url返回Access Control Allow Origin:

 app.use(cors({
  origin: 'https://fakeUrl.net/',
  optionsSuccessStatus: 200,
}));  


但当我传递列表时,express不会返回标题:

 var allowedOrigins = ['https://fakeUrl.net','https://fakeUrl2.net/'];

app.use(cors({
  origin: function(origin: any, callback: any){
    if(!origin){
      console.log('Cors indefinido: ' + origin);
      return callback(null, true);
    }
    if(allowedOrigins.indexOf(origin) === -1){
      console.log('Cors fora da lista: ' + origin);
      var msg = 'The CORS policy for this site does not ' +
                'allow access from the specified Origin. Return 12221511';
      return callback(new Error(msg), false);
    }
    console.log('Cors dentro da lista: ' + origin);
    return callback(null, true);
  },
  optionsSuccessStatus: 200,
}));  
或者像这样:

 app.use(cors({
  origin: ['https://fakeUrl.net','https://fakeUrl2.net/'],
  optionsSuccessStatus: 200,
}));  
只是不工作

我相信这在Express中是一个问题,我已经在github上为车队开了一张票,但现在已经关闭了


任何人都可以解决这个问题?

您可以使用一个函数来定制cors,而不是将其作为一种方法传递:

const whitelist = ['http://something.com', 'http://example.com'];

    const corsOptionsCheck = (req, callback) => {
    let corsOptions;

    let isDomainAllowed = whitelist.indexOf(req.header('Origin')) !== -1;

    if (isDomainAllowed) {
        // Enable CORS for this request
        corsOptions = { origin: true }
    } else {
        // Disable CORS for this request
        corsOptions = { origin: false }
    }
    callback(null, corsOptions)
}

app.use(cors(corsOptionsCheck));

不幸的是,我需要强制报头:

var allowedOrigins = ['https://fakeUrl.net','https://fakeUrl2.net/'];

let origin = (req.headers.origin != undefined && req.headers.origin.length > 0)? (req.headers.origin ?? "") : (req.headers.host ?? "");
    let theOrigin = "";
    
    ALLOWED_ORIGINS.forEach(element => {
      if(element.toLowerCase().includes(origin?.toLowerCase() ?? ""))theOrigin = element;
    });

if(!theOrigin && theOrigin.length > 0){
      res.header("Access-Control-Allow-Origin", theOrigin);
      res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    }

我尝试了许多我发现的示例,但没有一个能够完美工作。

我需要一个返回头访问控制Allow Origin。验证正常。如果源标头包含白名单数组中存在的任何域,则此代码将允许CORS。您可以检查响应标头访问控制允许来源。有关更多详细信息,您可以在此处查看其工作原理:“但当我传递列表时,express不会返回标题”-它会做什么?这里有很多日志语句,但没有告诉我们它们的输出。