CORS Node.js问题

7

我已经在 stack 上查看了多篇帖子,但仍然找不到正确的答案。

也查阅了 CORS 扩展文档。

我现在运行的服务器代码如下:

var WebSocketServer = require("ws").Server
var http = require("http")
var express = require('express')
var cors = require('cors')
var app = express();

app.use(cors());
var port = process.env.PORT || 9000

var server = http.createServer(app)
server.listen(port)
var count   = 0;
var clients = {};
var rooms   = {};
var wss = new WebSocketServer({server: server})
wss.on("connection", function(ws) {
    ws.on("create-room", function(data) {
        rooms[data] = {creator : data.user_id, created : new Date()}
    })
    ws.on("close", function() {
        console.log("websocket connection close")
    })
})

但是我遇到了以下问题:
XMLHttpRequest无法加载http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-CbU0。当凭证标志为true时,“Access-Control-Allow-Origin”头中不能使用通配符“*”。因此,不允许http://localhost:8100访问。XMLHttpRequest的凭证模式由withCredentials属性控制。
如果我注释掉app.use(cors());这一行,我会遇到以下问题:
XMLHttpRequest无法加载http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-Cwb8。所请求的资源上不存在“Access-Control-Allow-Origin”头。因此,不允许http://localhost:8100访问。响应具有HTTP状态代码404。
所以显然我的服务器正常运行,但是……
1个回答

9
正如错误消息所说,通配符Access-Control-Allow-Origin不能与Access-Control-Allow-Credentials一起使用。默认情况下,cors模块使用了一个通配符源,而默认情况下,socket.io需要凭据(至少在这里是这样)。您需要做的是读取请求的Origin头,并将其包含在响应的Access-Control-Allow-Origin中。
幸运的是,cors使这非常容易:为了反映请求来源,请传递带有origin: true属性的选项对象。您还需要一个credentials: true属性来允许所有凭据。
app.use(cors({
    origin: true,
    credentials: true
}));

谢谢您的回复,现在我明白了“凭证标志为'true',但'Access-Control-Allow-Credentials'头为空”的含义。 - ka_lin
不过有一个问题,现在当浏览器调用URL时我会得到404错误...如果我删除你的解决方案,我会得到CORS错误...这很令人困惑... - ka_lin
嗨,我读了整个帖子,但这对我没有用。你能看一下我的问题吗?https://stackoverflow.com/questions/59679427/cors-validation-for-socket - Sheraz Ahmed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接