CORS节点js问题

时间:2016-03-28 17:12:04

标签: angularjs node.js socket.io cors

经过堆叠的多个帖子,我仍然无法找到正确的答案。

同时查看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.

很明显我的服务器运行正常,但是

1 个答案:

答案 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
}));