【发布时间】:2022-01-20 06:27:05
【问题描述】:
由于某种原因,localhost:3000 能够在我的服务器上创建一个套接字,但 127.0.0.1:3000 不能。 127.0.0.1:3000 成功拉取内容但未连接到服务器,尽管代码如下:
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:3000');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('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', true);
// Pass to next layer of middleware
next();
});
这是我得到的错误:
Access to XMLHttpRequest at 'http://localhost:3000/socket.io/?EIO=4&transport=polling&t=NvqFfaS'
from origin 'http://127.0.0.1:3000' has been blocked by CORS policy:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
我不明白为什么它对待 2 的方式不同。
这是运行的 server.js 文件:
var express = require('express');
var app = express();
var server = app.listen(3000);
app.use(express.static('public'));
app.use(function (req, res, next) {
// Website you wish to allow to connect
res.setHeader('Access-Control-Allow-Origin', 'http://localhost:3000');
res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:3000');
// Request methods you wish to allow
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');
// Request headers you wish to allow
res.setHeader('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', true);
// Pass to next layer of middleware
next();
});
console.log("Socket is running");
var socket = require('socket.io');
var io = socket(server);
io.sockets.on('connection',newConnection);
function newConnection(socket){
console.log('new connection: '+socket.id);
socket.on('mouse',mouseMsg);
function mouseMsg(data){
socket.broadcast.emit('mouse',data);
//io.sockets.emit('mouse',data);
console.log(data);
}
}
【问题讨论】:
-
客户端响应中
Access-Control-Allow-Origin的值是多少? -
大概,与 localhost:3000 连接不需要 CORS,因为它与客户端的来源相同。换句话说,对于 socket.io 连接,根本没有达到您的 CORS 配置,因为如果您获得错误的原始值,错误消息会有所不同。
-
@KevinB 代码在运行的主 server.js 文件中
-
是的,但是,socket.io 请求可能不会通过该中间件进行路由。
-
@KevinB 我刚刚添加了完整的 server.js 代码。如果您也需要,我可以发送客户端。
标签: node.js http sockets server localhost