背景:我有一个在本地主机上运行的 node.js 服务器(称为服务器 A);和在 https://example.net:3000 上运行 node.js 的外部服务器(称为服务器 B)。我无法控制或访问服务器 B(它是我家中 IoT 设备的仪表板站点),但我需要连接到正在使用 socket.io 并发出特定消息。
我可以从一个平面 javascript 文件(客户端)轻松连接到它,但需要它在服务器端运行(最终目标是使它成为我可以通过 HTTP 请求调用的东西); How to connect two node.js servers with websockets? 等示例表明我应该能够使用来自 node.js 的 socket.io-client 和几乎相同的代码来实现相同的结果。但是当我从 node.js 运行代码时,我无法连接到套接字。
下面是在平面 javascript 文件中成功运行的代码。我知道它有效,因为我在控制台中看到“套接字连接”,而且我还可以测试最后发出的套接字。
var myemail = "email@gmail.com";
var device_id = '12345';
// Create SocketIO instance, connect
var socket = io.connect('https://example.net:3000');
socket.on('connect', function(){
try {
console.log('socket connect');
socket.emit('configure', {email:myemail, deviceid:device_id});
} catch(e) {
console.log(e);
}
});
socket.emit("/" + device_id, "45678");
...以下是从我的 node.js 实例运行时无法运行的代码。我希望命令行日志中出现“socket connect”消息,但什么也得不到。
var express=require('express');
var http=require('http');
var app=express();
var server = http.createServer(app);
//Variables
var myemail = "email@gmail.com";
var device_id = '12345';
var io = require('socket.io-client');
var socket = io.connect('https://example.net:3000');
//Connect listener
socket.on('connect', function(){
try {
console.log('socket connect');
socket.emit('configure', {email:myemail, deviceid:device_id});
} catch(e) {
console.log(e);
}
});
socket.emit("/" + device_id, "45678");
有什么想法吗?
更新
运行调试实用程序,结果包含在下面的链接图像中。我看到的关键是 engine.io 尝试进行 xhr 轮询,并从服务器返回 503 响应。 (显然,服务器再次出现真正的“临时错误”,这一切都可以通过在 chrome 中运行客户端 js 来实现)。
最佳答案
解决了这个 - 问题是我连接到的服务器需要使用 https,所以我需要添加
{secure: true, rejectUnauthorized: false}
在要连接的 url 之后。
完整的工作示例:
const myemail = email@email.com;
const device_id = 12345;
io = require('socket.io-client');
var socket = io.connect('https://server.net:3000',{secure: true, rejectUnauthorized: false});
function doStuff(){
//Listener
socket.on('connect', function(){
try {
console.log('socket connect');
socket.emit('configure', {email:myemail, deviceid:device_id});
} catch(e) {
console.log(e);
}
});
socket.emit("/" + device_id, "003021");
}
doStuff();
关于javascript - 使用 Node.js 中的 Socket.IO 连接到外部服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45777998/