CORS节点js问题
经过了多个post,我仍然找不到正确的答案。
检查了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());
注释行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。
所以很清楚,我的服务器运行正常,但
如错误消息所示,通配符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 }));