代码之家  ›  专栏  ›  技术社区  ›  Hamza Haddad

当请求的凭据模式为“include”时,响应中的“access control allow origin”头的值不能是通配符“*”

  •  -1
  • Hamza Haddad  · 技术社区  · 6 年前

    我试图在angular和nodejs服务器之间连接socket.io

    在角度上,我已经声明了一个新的插座并连接它 从“socket.io client”导入*作为IO; … @组成部分 … const socket=io.connect(' http://localhost:3000 “”;

    后端:server.js

    const express = require('express');
    const app = express();
    var http = require('http').Server(app);
    var io = require('socket.io')(http);
    io.set('origins', 'http://localhost:4200');
    
    var routes = require('./routes/routes')(io);
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.use(function (req, res, next) {
        res.header("Access-Control-Allow-Origin", "*");
        res.header("Access-Control-Allow-Methods", "GET, POST, PUT ,DELETE");
        res.header(
            "Access-Control-Allow-Headers",
            "Origin, X-Requested-With, Content-Type, Accept"
        );
        next();
    });
    io.on('connection', function (socket) {
        socket.emit('news', { hello: 'world' });
        console.log("connectd");
    });
    app.use('/', routes);
    var server = app.listen(3000, function (io) {
    })
    

    应用程序正在编译并从服务器获取数据。但只有socket.io不工作 我得到这个错误:

    localhost/:1未能加载 http://localhost:3000/socket.io/?EIO=3&transport=polling&t=MEpHAtN :当请求的凭据模式为“include”时,响应中的“access control allow origin”头的值不能是通配符“*”。起源' http://localhost:4200 因此不允许访问。xmlhttprequest启动的请求的凭据模式由withcredentials属性控制。

    为什么即使在服务器端配置了cors,错误仍然存在?

    1 回复  |  直到 6 年前
        1
  •  6
  •   Marcos Casagrande    6 年前

    这一信息非常明确:

    “access control allow origin”的值 响应中的头 不能是通配符“*” 当请求的凭据模式为 '包括

    发生这种情况是因为您正在设置属性 withCredentials 关于你的 XMLHttpRequest true . 所以你需要去掉通配符,然后添加 Access-Control-Allow-Credentials 头球。

    res.header("Access-Control-Allow-Origin", "http://localhost:4200");
    res.header('Access-Control-Allow-Credentials', true);
    

    你可以用 cors 包,以便轻松实现白名单:

    const cors = require('cors');
    const whitelist = ['http://localhost:4200', 'http://example2.com'];
    const corsOptions = {
      credentials: true, // This is important.
      origin: (origin, callback) => {
        if(whitelist.includes(origin))
          return callback(null, true)
    
          callback(new Error('Not allowed by CORS'));
      }
    }
    
    app.use(cors(corsOptions));