我正在Node.js中开发一个基于express-ws的应用程序,并且正在app.ws
路由中使用Watch.js监视程序。打开WebSocket时,将使用watch
语句中定义的回调函数在全局对象上创建app.ws
。然后在ws.on('close', ...
函数中,使用相同的对象和回调函数调用unwatch
。 (请参见代码段A)
这适用于具有简单布尔项的简单JS对象(请参见代码段A中的stat_A
)。但是,很快我将有多个具有不同状态的对象,我想将它们全部放入一个新的JS对象中。因此,这是一个内部带有一堆对象的对象。
片段B是应该等同于片段A的示例。但是,似乎在关闭WebSocket之后,unwatch
并不会以某种方式使用,并且{{1 }}已更新,程序尝试通过关闭的WebSocket发送它并崩溃。
我很困惑。是什么导致stat['A']
失败?
编辑:通过将unwatch
更改为watch(stat, 'A', send_stat)
,并以相同的方式更改watch(stat['A'], send_stat)
,我得到了代码片段B的工作。请参见代码段C。现在,我无法取消监视unwatch
主列表,请参见代码段D。
代码段A(stat
在其他位置已更新):
stat_A
代码段B(const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');
const port = 1338;
var stat_A = {'1': true, '2': false, '3' : false};
app.ws(
'/stat_A',
(ws, req) => {
function send_stat() {
ws.send(JSON.stringify(stat_A));
}
send_stat();
// Setup watchers
watchjs.watch(stat_A, send_stat);
ws.on(
'close',
() => {
// Stop watchers
watchjs.unwatch(stat_A, send_stat);
}
);
}
);
app.listen(
port,
() => {
console.log(`Listening (HTTP) on port ${port}!`);
}
);
在其他位置已更新):
stat['A']
代码段C(B固定):
const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');
const port = 1338;
var stat = {
'A': {'1': true, '2': false, '3' : false}
};
app.ws(
'/stat_A',
(ws, req) => {
function send_stat() {
ws.send(JSON.stringify(stat['A']));
}
send_stat();
// Setup watchers
watchjs.watch(stat, 'A', send_stat);
ws.on(
'close',
() => {
// Stop watchers
watchjs.unwatch(stat, 'A', send_stat);
}
);
}
);
app.listen(
port,
() => {
console.log(`Listening (HTTP) on port ${port}!`);
}
);
代码段D(与B相同,不适用于C):
const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');
const port = 1338;
var stat = {
'A': {'1': true, '2': false, '3' : false}
};
app.ws(
'/stat_A',
(ws, req) => {
function send_stat() {
ws.send(JSON.stringify(stat['A']));
}
send_stat();
// Setup watchers
watchjs.watch(stat['A'], send_stat);
ws.on(
'close',
() => {
// Stop watchers
watchjs.unwatch(stat['A'], send_stat);
}
);
}
);
app.listen(
port,
() => {
console.log(`Listening (HTTP) on port ${port}!`);
}
);
答案 0 :(得分:0)
因此,对此的最终答案如下。
const express = require('express');
const app = express();
const expressWs = require('express-ws')(app);
const watchjs = require('watchjs');
const port = 1338;
var stat = {
'A': {'1': true, '2': false, '3' : false}
};
app.ws(
'/stat',
(ws, req) => {
function send_stat() {
ws.send(JSON.stringify(stat));
}
send_stat();
// Setup watchers
Object.keys(stat).forEach((key) => {
watchjs.watch(stat[key], send_stat);
})
ws.on(
'close',
() => {
// Stop watchers
Object.keys(stat).forEach((key) => {
watchjs.unwatch(stat[key], send_stat);
})
}
);
}
);
app.ws(
'/stat/A',
(ws, req) => {
function send_stat() {
ws.send(JSON.stringify(stat['A']));
}
send_stat();
// Setup watcher
watchjs.watch(stat['A'], send_stat);
ws.on(
'close',
() => {
// Stop watcher
watchjs.unwatch(stat['A'], send_stat);
}
);
}
);
app.listen(
port,
() => {
console.log(`Listening (HTTP) on port ${port}!`);
}
);