gpt4 book ai didi

json - 如何使nodejs服务器异步

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:35 25 4
gpt4 key购买 nike

我有一个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});
})
});

最佳答案

以下是一些一般准则:

  1. 检查您可以从外部服务获取的 API。了解它是否提供了任何功能,可以让您建立 webSocket 连接或其他一些连续的 TCP 连接,以便您可以在情况发生变化时获得实时(或接近实时)通知。如果是这样,请让您的服务器使用它。

  2. 如果外部服务器没有实时通知 API,那么您只需每 xx 秒轮询一次。要决定轮询的频率,您需要考虑:a) 您的网页中真正需要新数据的频率(例如,也许 5 分钟内的最新数据就可以),b) 服务条款是什么速率限制是针对第 3 方服务的(例如,他们让您轮询的频率)以及 c) 您的服务器可以承受多少轮询(从服务器负载的角度来看)。

  3. 一旦确定了轮询外部服务的频率,您就可以为自己构建一个循环轮询机制。最简单的方法是使用为轮询间隔时间设置的 setInterval() 。我有一个树莓派 node.js 服务器,它使用 setInterval() 来重复检查多个温度传感器。只要您根据情况选择合适的间隔时间,该机制就可以正常工作。

  4. 然后,为了将新信息传回已连接的网页,从服务器获得接近“实时”更新的最佳方法是让网页与服务器建立 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>

关于json - 如何使nodejs服务器异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38883569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com