【问题标题】:CORS node js issueCORS节点js问题
【发布时间】:2016-07-15 23:56:20
【问题描述】:

浏览了堆栈上的多个帖子后,我仍然找不到正确的答案。

还检查了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。一种 通配符 '*' 不能在 '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。

很明显我的服务器已经启动并运行正常,但是

【问题讨论】:

    标签: angularjs node.js socket.io cors


    【解决方案1】:

    正如错误消息所说,通配符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
    }));
    

    【讨论】:

    • 感谢您的回复,现在我收到Credentials flag is 'true', but the 'Access-Control-Allow-Credentials' header is ''
    • 虽然有一个问题,但现在我在浏览器调用 url 时得到 404...如果我删除您的解决方案,我会收到 cors 错误...令人困惑...
    • 嗨,我阅读了整个线程,但这对我不起作用。你也能看看我的问题吗? *.com/questions/59679427/cors-validation-for-socket