前端先发 setMode 再发 start,服务端日志里 start 先落,setMode 后到,设备按默认模式跑起来,十次里能复现三次。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,前端在两个异步回调里各发一次 send,谁先执行取决于 Promise 的完成顺序,WebSocket 只保证单条连接内按写入顺序发送。服务端如果在 onmessage 里直接起异步任务,落库顺序还会再乱一次。

「WebSocket 消息乱序」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。报错里带路径的,先去看那个路径在不在、权限对不对。

await send({ type: 'setMode', mode: 2 });
await send({ type: 'start' });
// 或者 { seq: 2, actions: [{type:'setMode'}, {type:'start'}] }

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,把两条指令合成一条消息 用数组承载动作列表;确实要分开发就串成 Promise 链 上一条回调再发下一条;服务端 onmessage 里先入队再按序消费;加自增 seq 发现跳号就丢弃重来。

最后用这个标准收尾,连续操作 50 次日志里 setMode 总在 start 前面 没有再出现默认模式启动。

作者 9823189