2017-02-11 43 views
0

一直在Google上搜索,尝试了一些东西,并想出了各种奇怪的解决方案来解决我的问题,而没有真正获得任何地方。我的问题是,我将如何设置我的express.js应用程序让它每30秒运行一次?如何设置ExpressInterval应用程序?

推理是这样的,我有一堆变化每变化约30s,我需要重新呈现页面,以便这些显示出来。我提出的“解决方案”遇到了EADDRINUSE错误,因为我试图在与旧的端口相同的端口上创建一个新的服务器,所以我明白在这里需要做某些事情来避免这种情况,但什么?

如果有人想知道我尝试过了什么,我已经尝试了process.exit(并让PM2重新启动我的应用程序),setInterval,故意撞毁我的应用程序让PM2重新启动,甚至开始重写所有东西以让Web套接字运行在客户端和服务器之间来回切换,但是我觉得这可能会使问题过于复杂(如果我刚刚了解如何,标准的setInterval将解决所有问题)。

下面是我的快递脚本:

var express = require('express'); 
var app = express(); 
var ejs = require('ejs'); 
var config = require('./config'); 
app.set('view engine', 'html'); 
app.engine('html', ejs.renderFile); 

app.get("/", function(req, res){ 
app.use(express.static(__dirname + '/views')); 

async(function(variables) { 
    res.render('index', 
    { 
    // stuff to render 
    }); 
}); 
function async(callback) { 
    // several variables... 
    callback(variables); 
} 


}); 

app.listen(config.port, "0.0.0.0"); 
+0

你在服务器端尝试'setInterval'吗?这是行不通的。可以将它设置在客户端并在tick上重新加载数据或使用socket.io并将数据从服务器推送到客户端。 –

回答

0

你想谷歌的东西是:彗星,长拉,网络套接字,event sourcing

基本上这就是我将如何对这项任务的工作:

  1. 在您的Web服务器有一个全球性的状态,简单的setInterval进行更新和setInterval不断做AJAX调用网页。

  2. 使用web sockets而不是setInterval(AJAX)将新状态推送给客户端。

第二种方法更快,更可取,但如果您需要支持旧版浏览器,则可能需要回退。

+0

谢谢!这至少会给我一个好的开始。我会将其设定为我接受的答案。 :) – Erik

+0

是否可以对接受的答案进行后续问题,还是应该为其创建新问题? – Erik

+0

这里是我的问题: 我用websockets取得了很大的成功,但我陷入了一个不确定如何区分消息事件的情况。客户如何知道在下面的websocket onmessage中哪个事件应该发送到messageA/B?这是否设置在服务器上,如果是这样,如何? '''Client: ws.onmessage = function(event){ messageA(event.data); messageB(event.data); };' '服务器: ws.send(JSON。stringify(messageA),function(){...}); (JSON.stringify(messageA),function(){...}); ''' – Erik

0

你确定这是正确的做法?对我来说这似乎不正确。我不会这样做。

您必须使用一些JS脚本(用于自动刷新页面或使用AJAX/WS更新值)或等效的meta tag在客户端上设置刷新功能。

+0

我不确定这是否是正确的方法,但我真的不知道我该怎么做。我在app.get-function中有几个变量,除非我重新运行express.js脚本,否则不会更新,因此我需要重新运行该脚本。 – Erik