json - 如何使nodejs服务器异步

标签 json node.js

我有一个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/

相关文章:

ruby-on-rails - rails : how to set json format for redirect_to

node.js - Node + Express 路由器 + 类型脚本 : string arg is not assignable to requesthandlerparams type

node.js - 如何通过分离的后端和前端进行社交身份验证(Passport/Express/React)

javascript - vue中如何比较两个json的数据并根据结果显示图标?

json - TTL 文件格式 - 我不知道这是什么

javascript - 使用缓冲区复制 fs.createReadStream

javascript - webpack source maps 是匿名的

Node.js 终止异步调用

php - 处理来自 php 和 jQuery 的 json 变量,改为给出文本变量

json - Go - 即时修改 JSON