大家好
在将我的两个NoddJs应用程序推送到我的Ubuntu服务器(使用https在nginx中提供网站)后,我遇到了一个问题。在我的本地环境中使用localhost,成功建立了连接,但是在推送到服务器后,我在客户端JavaScript控制台内的第二个应用程序(管理员)admin.domainname.com中得到了以下响应:
第一个月
下面是我在domainname.com上运行的第一个应用程序中建立套接字并发送消息的部分:
/*rest of app.js file with express.js*/
const PORT = 3000;
const server = app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`)
})
const socket = socketIo(server);
socket.on('connection', (socket) => {
console.log("connected")
socket.emit("testmessage", "Hello World")
socket.on('disconnect', () => {});
});
字符串
在我的客户端JavaScript中的第二个应用程序(admin.domainname.com)中,我希望接收这样的消息:
const socketdomainconstruct = () => {
if (location.port) {
return "http://localhost:3000"
} else {
return "https://domainname.com"
}
}
const socket = io(socketdomainconstruct(), { transports: ['websocket', 'polling', 'flashsocket']
socket.on("connect", () => {
console.log("connected");
socket.on("testmessage", (message) => {
console.log(message);
});
});
型
为了解释,当我在上面的socket.io示例中使用http://localhost:3000时,我可以成功连接,一切都按照预期工作,所以整体结构没有问题。只有当我切换到https时,我才得到错误,我似乎不明白,因为没有什么变化。
潜在问题可能包括:
- 我初始化Socket服务器的方式(也许它不能通过https访问,但这会很奇怪,因为nodejs应用程序在nginx中运行,具有有效的SSL证书,也许我还需要包括Socket.io服务器的配置??)
- 与CORS的东西=>,但我没有得到任何错误,我所有的标题设置(两个应用程序基本上有相同的)=>见下文:
app.use((req, res, next) => {
res.removeHeader('Server');
res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0');
res.setHeader('Pragma', 'no-cache');
res.setHeader('Expires', '0');
res.setHeader('Last-Modified', new Date().toUTCString());
res.setHeader('Content-Security-Policy', "default-src 'self'; script-src 'self' 'unsafe-inline' cdn.socket.io code.jquery.com cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' bing.com; connect-src 'self' *");
res.setHeader('Permission-Policy', 'accelerometer=(), camera=(), microphone=(), geolocation=(), gyroscope=()');
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('X-Content-Type-Options', 'nosniff');
res.setHeader('X-Frame-Options', 'deny');
res.setHeader('X-XSS-Protection', '1; mode=block');
res.setHeader('Strict-Transport-Security', 'max-age=31536000; includeSubDomains');
res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin');
next();
});
型
我希望有人能帮助我澄清/隔离的问题,甚至解决它与我,作为参考,我也将包括从Socket.io有用的链接
- https://socket.io/docs/v4/server-initialization/#with-an-https-server
- https://socket.io/docs/v4/server-initialization/#with-express
提前感谢您提供的任何帮助和提示,这对我来说真的很有帮助!
- 拉菲尔酒店 *
1条答案
按热度按时间nfzehxib1#
问题已修复,方法是首先将正确的cors选项添加到SocketIO服务器对象:
字符串
查看更多关于SocketIO的文档:
另外,我必须正确设置Nginx代理,像这样:
型
这也可以在SocketIO文档中看到,它不仅适用于Nginx,也适用于Apache和Caddy 2!
总的来说,这个问题可以通过正确阅读文档来预防,它们非常好,感谢大家的帮助,祝你有美好的一天,希望解决问题可以帮助其他有类似问题的人
我的设置是
干杯拉斐尔