express-ws как периодически проверять пользовательское событие и автоматически предпринимать действия
Я использую express-wshttps://www.npmjs.com/package/express-ws (API, который помогает создавать сервер для клиентов express и websocket).
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)
    })
  })
});
теперь, как вы можете видеть с кодом выше, всякий раз, когда соединение создается, оно проверяет длину содержимого и отправляет conetent клиенту, если больше 0.
следующий код маршрутизатора, по веб-запросу, обновляет файл. Проблема с этим, если когда - то после создания соединения, если этот файл был изменен, это соединение не знает об этом и, следовательно, функция send не вызывается. Я также попробовал fs.смотрите, но я не могу заставить его работать.
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();
      });
    }
  });
то, что я хотел бы, когда файл обновляется, ws.отправить можно вызвать для одного из соединений websocket.
3 ответов
поскольку ваш сервер изменяет файл, нет необходимости использовать fs.watch Как вы уже знаете, когда файл изменяется. Все, что осталось сделать, это перебрать список открытых соединений и отправить им новое содержание.
var connections = []; // Keeps track of all connections
app.ws('/', function(ws, req) {
   console.log("New connection")
   connections.push(ws); // Add the new connection to the list
  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)
    })
  })
  // TODO: Make sure you remove closed connections from `connections`
  // by listening for the ws `close` event.
});
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' });
  connections.forEach(function(c){
    c.send(text); // Send the new text to all open connections
  }
});
обратите внимание: это не будет работать, если у вас есть несколько процессов или серверов, но поскольку вы пишете в локальную файловую систему вместо базы данных, я предполагаю, что это не является требованием.
этот простой код хорошо работает с express. Если несколько задержек не проблема для вас, вы можете использовать это.
setInterval(milisecondsToCheck, checkFunction)
дополнительные
http://www.w3schools.com/jsref/met_win_setinterval.asp
https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setInterval
Если вы используете его так, вы можете закончить его после того, как ваша работа сделана:
var timer = setInterval(milisecondsToCheck, checkFunction);
снимите:
clearInterval(timer);
решил это с чем-то вроде этого
var conn_array = [];
app.ws('/', function(ws, req) {
    conn_array.push(ws)
    console.log("New connection")
    fs.readFile(file, 'utf8', function (err, data) {
        if (err) throw err;
        content = data.toString();
        if (content.length > 0) {
            console.log(content.length)
            conn_array[0].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)
        })
    })
});
function readFile(){
    console.log("I am here")
    fs.readFile(file, 'utf8', function (err, data) {
        if (err) throw err;
        content = data.toString();
        if (content.length > 0 && conn_array.length>0) conn_array[0].send(content);
    })
}
var interval = setInterval(readFile, 100000);
на данный момент я предположил, что есть только один клиент