Socket.io: CORS

创建于 2017-02-03  ·  11评论  ·  资料来源: socketio/socket.io

嘿嘿,

如何删除响应标头Access-Control-Allow-Origin
看起来设置{'origins' : 'asfdasd.com'}不起作用。

POST /socket.io/?EIO=3&transport=polling&t=1481690658797-5&sid=Dp18NNt_bWPkB4rGAAAP HTTP/1.1
来源: https :

HTTP/1.1 400 错误请求
内容类型:应用程序/json
访问控制允许凭据:true
访问控制允许来源: https :
日期:2017 年 2 月 3 日星期五 12:27:42 GMT
连接:保持连接
传输编码:分块

最有用的评论

@thEpisode我意识到这是一个旧线程,但最后一个链接为我修复了它! 大多数 Express 教程都有app.listen(...)但在使用socket.io的情况下,您需要确保在index.js调用http.listen(...)而不是听app对象,否则您会遇到此 CORS 问题。 这么小的事情!

所有11条评论

同样的错误

@Kenzku @thEpisode您使用的是哪个版本的 socket.io?

它应该在2.x (包括 https://github.com/socketio/engine.io/pull/452)中修复。

@darrachequesne感谢您的回复。 我是 Crawler Site (https://www.crawlersite.com) 的创建者,我们使用 Socket.io 将数据发送到我们的服务器,我们所有的基础设施都在 Microsoft Azure 上,所有测试和第一个 beta 测试人员都使用 Azure,我们还没有没有问题,但是一个新的 betatester 使用了另一个云服务提供商,他报告了一个错误。 问题是 CORS,我们在 Google 上阅读了所有问题!! 并搜索解决方案,我们注意到 Socket.io 已更新为 2.0(服务器中正好是 2.0.1),我们更新了客户端和服务器但问题仍然存在,我们使用 Express 也报告了 CORS 的问题并解决了它。

我们非常沮丧,因为 Google 上的所有解决方案都没有解决问题,很抱歉没有在 GitHub 问题或 StackOverflow 上发布此问题,但我们想提供所有可能解决问题的详细信息。 一些要测试的网址:

后端 URI: http :
测试 Express CORS: https :
测试 Socket.io CORS: https ://testcrawlersite.000webhostapp.com(请查看控制台)
我们要测试的主要站点: http :
Socket.io 文件: http ://crawlerbackend.azurewebsites.net/socket.io.js

我们的 app.js 的一部分:
`
var path = require('path');
var bodyParser = require('body-parser');
var cors = require('cors');
var express = require('express');
var app = express();

// use body parser so we can get info from POST and/or URL parameters
app.use(bodyParser.urlencoded({ extended: true })); // support encoded bodies
app.use(bodyParser.json()); // support json encoded bodies
app.use(cors({ origin: '*' }));
// Settings for CORS
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.header('Access-Control-Allow-Origin', '*');

    // Request methods you wish to allow
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.header('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', false);

    // Pass to next layer of middleware
    next();
});

var server = app.listen(cross.NormalizePort(process.env.PORT || 3500));
var io = require('socket.io').listen(server, {
    log: false,
    agent: false,
    origins: '*:*',
    transports: ['websocket', 'htmlfile', 'xhr-polling', 'jsonp-polling', 'polling']
});

`

问题解决!! @Kenzku请查看此文档: https : https : https :

伟大的! 我想我们现在可以关闭问题了。

@thEpisode我意识到这是一个旧线程,但最后一个链接为我修复了它! 大多数 Express 教程都有app.listen(...)但在使用socket.io的情况下,您需要确保在index.js调用http.listen(...)而不是听app对象,否则您会遇到此 CORS 问题。 这么小的事情!

@frewinchristopher我遵循与你上面提到的相同的模式,在本地它工作正常,但在远程它会抛出(原因:CORS 请求没有成功)。 我错在哪里..?

@gowthamyaal你能告诉我们你的代码吗?

感谢您的关注,但解决了 CORS 问题,因为我使用 AWS 时弹性 ip 和本地 ip 存在冲突,后来我将套接字侦听 ip 更改为 0.0.0.0,这解决了我的问题。

现在面临远程竞争条件问题,我正在使用 webpack-dev-config,我曾尝试使用 io connect 并在同一文件中发出代码,但最终出现未定义的错误

webpack-dev-config

客户端套接字代码
;)

注释行确实对我有用....谁能帮我解决这个问题....提前致谢

我已经遵循了我能找到的所有解决方案,但仍然没有发送有效的回复。 如果有人可以看看,我会非常感激。

`const express = require('express')
const http = require('http')
const socketIO = require('socket.io')
const cors = require('cors')

// 主机端口
常量端口 = 3001

const app = express()
app.use(cors())
// 服务器实例
const server = http.createServer(app)
// 使用服务器实例创建套接字
const io = socketIO(服务器)

io.origins("http://localhost:3000")

io.on('连接', 套接字 => {
console.log("用户已连接")

socket.on('disconnect', () => {
    console.log("User Disconnected")
})

socket.on('send message', (message) => {
    io.sockets.emit('send message', message)
})

})

server.listen(port, () => console.log( Listening on port ${port} ))`

此页面是否有帮助?
0 / 5 - 0 等级