经过堆叠的多个帖子,我仍然无法找到正确的答案。
同时查看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。一个 通配符' *'不能用于“访问控制 - 允许 - 来源”#39; 凭证标志为true时的标头。起源 ' http://localhost:8100'因此不允许访问。该 XMLHttpRequest的凭证模式由 withCredentials属性。
如果我使用app.use(cors());
我明白了:
XMLHttpRequest无法加载 http://localhost:9000/socket.io/?EIO=3&transport=polling&t=LE-Cwb8。没有 '访问控制允许来源'标题出现在请求的上 资源。起源' http://localhost:8100'因此是不允许的 访问。响应的HTTP状态代码为404.
很明显我的服务器运行正常,但是
答案 0 :(得分:9)
正如错误消息所示,通配符Access-Control-Allow-Origin
来源不能与Access-Control-Allow-Credentials
一起使用。默认情况下,cors
模块使用一个狂野的来源,默认情况下,socket.io需要凭据(或者无论如何它都在这里)。您需要做的是阅读请求的Origin
标题并将其包含在响应的Access-Control-Allow-Origin
中。
幸运的是,cors
使这很容易:为了反映请求来源,传入一个带有origin: true
属性的options对象。您还需要credentials: true
属性才能允许凭据:
app.use(cors({
origin: true,
credentials: true
}));