Używam express-ws https://www.npmjs.com/package/express-ws (API, który pomaga w tworzeniu serwera dla klientów ekspresowych i websocket).express-ws jak okresowo sprawdzić niestandardowe zdarzenie i podjąć działanie automatycznie
app.ws('/', function(ws, req) {
console.log("New connection")
if (content.length > 0) {
console.log(content)
ws.send(content)
}
ws.on('message', function(msg, flags) {
console.log("Received "+ msg);
});
ws.on('data', function(msg, flags) {
var data = []; // List of Buffer objects
res.on("data", function(chunk) {
data.push(chunk); // Append Buffer object
console.log(data)
})
})
});
Teraz, jak widać z kodem powyżej, gdy połączenie jest go stworzył sprawdza długość treści i wysyła conetent do klienta, jeśli więcej niż 0.
następujący kod routera, na żądanie strony internetowej, aktualizuje plik. Problem z tym, jeśli kiedyś po utworzeniu połączenia, jeśli ten plik został zmodyfikowany, to połączenie nie wie o nim i dlatego funkcja wysyłania nie jest wywoływana. Próbowałem także fs.watch, ale nie mogę go uruchomić.
router.post('/run_restart', function(req, res, next) {
text = '{"to_do": "run_test", "devices":"all", "argv": { "test": "' + req.body.cmd + '", "cycles": "' + req.body.cycles + '", "awake_for": "' + req.body.wt + '" }}'
path = process.env['HOME']+'/Desktop/automation/Stressem/StressemWeb/bin/task.txt'
fs.writeFile(path, text)
res.render('home.jade', { title: 'Stressem' });
});
fs.watch(file, function (event) {
fs.stat(file, function (err, stats) {
if(stats.size>80){
console.log("Event: " + event);
fs.readFile(file, 'utf8', function (err, data) {
if (err) throw err;
content = data.toString();
});
}
});
To, co chciałbym, to zawsze, gdy plik jest aktualizowany, można wywołać ws.send dla jednego z połączeń websocket.
Dziękuję Ci rtime patrząc na to. Ale problem pozostaje ten sam. Jak mogę wywołać tę funkcję dla określonego połączenia? –
sprawdź to http://stackoverflow.com/questions/9935920/how-to-write-a-node-js-function-that-waits-for-an-event-to-fire-before-returnin – bmavus