如何使nodejs服务器asynchronous
我有一个nodeJS服务器,它从三个网站获取JSON并将其发送到我的网站(以JSON格式)显示。 我正在使用的网站上的JSON不断更新,每10秒钟一次。 我怎样才能使我的NodeJS服务器不断更新,使其具有最新的数据?
我假设这是不可能刷新页面,但它是最好的,如果页面不刷新。
如果NodeJS不可能做到这一点,并且有一个不同的方法来完成这个,如果你告诉我,我会非常感激。
码:
router.get("/", function(req, res){ var request = require('request-promise'); var data1; var data2; var data3; request("website1.json").then(function(body){ data1 = JSON.parse(body); return request("website2.json"); }) .then(function(body) { data2 = JSON.parse(body); return request("website3.json"); }) .then(function(body){ data3 = JSON.parse(body); res.render("app.ejs", {data1: data1, data2: data2, data3: data3}); }) });
以下是一些一般指导原则:
-
检查您的外部服务可用的API。 找出是否有任何东西可以让你做一个webSocket连接或其他连续的TCP连接,所以你可以实时(或接近实时)的通知,当事情发生变化。 如果是这样,请让你的服务器使用它。
-
如果没有来自外部服务器的实时通知API,那么您将不得不每隔xx秒轮询一次。 要决定你应该多长时间进行一次轮询,你需要考虑:a)你真的需要多长时间才能在你的网页上使用新的数据(例如,可能在5分钟内是最新的数据); b)服务条款和速率限制是针对第三方服务的(例如,他们多久会让您进行轮询),以及c)您的服务器能够承受多less轮询(从服务器负载的angular度来看)。
-
一旦你弄清楚你多久会轮询外部服务,那么你就build立了一个循环轮询机制。 最简单的方法是使用为您的轮询间隔时间设置的
setInterval()
。 我有一个使用setInterval()
重复检查几个温度传感器的覆盆子pi node.js服务器。 只要您为您的情况select适当的间隔时间,该机制就可以正常工作。 -
然后,为了将新信息传回给连接的网页,从服务器接近“实时”更新的最好方法是让网页与服务器build立一个webSocket或socket.io连接。 这是一个持续连接的套接字,通过这个套接字可以发送消息。 所以,使用这种机制,客户端将一个socket.io连接到您的服务器。 服务器接收该连接,并且该连接在该网页的整个生存期内保持打开状态。 然后,只要您的服务器有新的数据需要发送到该网页,它可以通过该socket.io连接发送一条消息。 网页将接收到该消息,然后可以基于消息中的数据相应地更新网页的内容。 不需要刷新页面。
以下是服务器代码的概要:
// start up socket.io listener using your existing web server var io = require('socket.io')(app); // recurring interval to poll several external web sites. setInterval(function () { var results = {}; request("website1.json").then(function (body) { results.data1 = JSON.parse(body); return request("website2.json"); }).then(function (body) { results.data2 = JSON.parse(body); return request("website3.json"); }).then(function (body) { results.data3 = JSON.parse(body); // decide if anything has actually changed on external service data // and whether anything needs to be sent to connected clients io.emit("newData", results); }).catch(function(err) { // decide what to do if external service causes an error }); }, 10000);
那么客户端代码一般是这样的:
<script src="/socket.io/socket.io.js"></script> <script> var socket = io(); socket.on("newData", function(data) { // process new data here and update the web page }); </script>