Node.js 被CORS策略阻止:否';访问控制允许原点';标题存在[Nodejs]

Node.js 被CORS策略阻止:否';访问控制允许原点';标题存在[Nodejs],node.js,express,cors,xmlhttprequest,Node.js,Express,Cors,Xmlhttprequest,确切的错误消息:访问位于的XMLHttpRequest'http://localhost:7000/profile/picture?url=me“起源”http://localhost:8080'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。 我使用的是express版本4.16.4。在我的应用程序中,在上传图像并注销后,当我重新登录时会出现此错误。我已将以下内容添加到我的主服务器: app.use('*', cors({

确切的错误消息:
访问位于的XMLHttpRequest'http://localhost:7000/profile/picture?url=me“起源”http://localhost:8080'已被CORS策略阻止:请求的资源上不存在'Access Control Allow Origin'标头。

我使用的是express版本4.16.4。在我的应用程序中,在上传图像并注销后,当我重新登录时会出现此错误。我已将以下内容添加到我的主服务器:

app.use('*', cors({ 
        credentials: true, 
        origin: true, 
        methods: 'GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS', 
        preflightContinue: true
    }));

... (routes here)

app.all('*', function (req, res, next) {
        origin = req.get('origin');

        // Development whitelist
        var whitelist = ['http://localhost:8080', 'http://localhost:8081'];

        corsOptions = {
            origin: function (origin, callback) {
                    var originIsWhitelisted = whitelist.indexOf(origin) !== -1;
                    callback(null, originIsWhitelisted);
            }
        };

        next();
    });
我得到
选项
日志,但没有一条路由被命中。节点中也不会抛出错误消息。

请尝试以下方法:

const whitelist = [
  'http://localhost:8080',
  'http://localhost:8081'
];

const corsOptions =  (origin) => {
    return whitelist.some(wl=> wl.localeCompare(origin) === 0);
};

app.use( (req, res, next) => {
    res.setHeader('Access-Control-Allow-Credentials', true);
    res.setHeader('Access-Control-Allow-Origin', '*');
    res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With, X-HTTP-Method-Override, Content-Type, Accept');
    if(!corsOptions(req.headers.origin)){
      const error = {
        erro : "This aren't a public API."
      };
      res.sendStatus(500).json(error);
      next();
    }
    if ('OPTIONS' == req.method) {
      res.sendStatus(200);
    } else {
      next();
    }
  });

为什么
preflightContinue
为true?这是什么?接下来是什么?它似乎没有任何作用。@KevinB我试图将节点应用程序限制为仅与我的vue应用程序通信。要使其正常工作,它需要位于路由之前,否则可能根本无法运行。但是你在里面的代码实际上什么都做不了。定义三个包含对象或字符串的变量,然后。。。调用next()。您可以使用这样一个函数来代替第一个函数,只允许CORS进入您的白名单,但您不应该同时使用这两个函数。第一个应该足以允许CORS请求,假设您在某个时间点正确检测到选项请求,并使用200或将preflight Continue更改为false进行响应。我现在收到此错误:
…已被CORS策略阻止:对preflight请求的响应未通过访问控制检查:响应中“访问控制允许来源”标头的值不得为通配符“*”当请求的凭据模式为“包括”时。XMLHttpRequest启动的请求的凭据模式由withCredentials属性控制。
Yup,不能将“true”用于已认证请求的源选项。您需要将其替换为返回原点值的回调。(这就是白名单出现的地方)