在express-ws中处理新的websocket连接

我正在尝试使用express-ws在服务器上创建API来远程控制Raspberry-pi,在pi上启动和停止程序以允许安全拔出。

这个想法是,用户将单击浏览器客户端上的按钮(开始/停止),这将向API发送一个GET请求,从而触发一个事件,该事件将通过网络套接字向pi发送消息。 pi正在使用websockets库运行python,以连接和接收来自API的消息。服务器正在使用以下代码:

const express = require('express');
const router = express.Router();

const events = require('events');
const eventEmitter = new events.EventEmitter();

router.get('/setDevice/:status',function(req,res){
    const status = req.params.status;
    eventEmitter.emit(status);
    res.send(status);
});

router.ws('/deviceStatus',function(ws,req){
    ws.on('open',function(){
        ws.send("Connected!");
        console.log('newConnection');
    });
    eventEmitter.on('start',function(){
        ws.send("start");
    });
    eventEmitter.on('stop',function(){
        ws.send("stop")
    });
    ws.on('close',function(){
        console.log("connection closed");
    });

});

module.exports=router;

只要GET端点被击中,我就可以成功地将pi连接到服务器并接收适当的消息,但是如果我断开pi并将其从服务器重新连接,它将不再接收消息,并且出现以下错误从服务器:

<body>
    <h1>WebSocket is not open: readyState 3 (CLOSED)</h1>
    <h2></h2>
    <pre>Error: WebSocket is not open: readyState 3 (CLOSED)
    at WebSocket.send (C:\Projects\BLE_webapp\api\node_modules\ws\lib\websocket.js:314:19)
    at EventEmitter.&lt;anonymous&gt; (C:\Projects\BLE_webapp\api\routes\socketRoutes.js:21:12)
    at EventEmitter.emit (events.js:203:15)
    at C:\Projects\BLE_webapp\api\routes\socketRoutes.js:11:18
    at Layer.handle [as handle_request] (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\layer.js:95:5)
    at C:\Projects\BLE_webapp\api\node_modules\express\lib\router\index.js:281:22
    at param (C:\Projects\BLE_webapp\api\node_modules\express\lib\router\index.js:354:14)</pre>
</body>

如果我重新启动服务器并再次连接pi,一切都很好。该错误似乎表明服务器正在尝试关闭已关闭的WebSocket,而不是新的WebSocket。有没有办法告诉express在关闭时删除旧的连接,而只关注实时连接?

注意:最终,我希望将其扩展为支持多个pi,并且用户可以打开/关闭特定设备。我不确定是否有更好的解决方案。我尚未对多个pi进行测试,但我感觉这将是一个更大的问题。

lite840 回答:在express-ws中处理新的websocket连接

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3130420.html

大家都在问