将异步数据推送到NodeJS中查看

时间:2018-02-02 21:28:45

标签: node.js express asynchronous

所以我的问题是我需要将一些数据从HTTP GET请求推送到一个视图,我不知道从哪里开始在Node.js。

我现在所知道的是:

var1 = 0;
var2 = 0;

some async HTTP GET Request -> {
    success: {
       var1 = 1;
    }
}

some async HTTP GET Request -> {
    success: {
       var2 = 2;
    }
}
res.render('index/asd', {var1: var1, var2: var2}) --> //Output var1/var2 = 0

我可以在异步请求之后推送数据而不等待它吗?像res.update(blabla)这样的东西?

1 个答案:

答案 0 :(得分:1)

  

我可以在异步请求之后推送数据而不等待它吗?像res.update(blabla)这样的东西?

没有。你不能。如果要异步获取某些数据,则需要等到实际获得所有数据后才能调用res.render()

因此,想象一下,您希望从两个外部网站获取数据,以便在res.render()操作中使用。

const rp = require('request-promise');

app.get((req, res) => {
    Promise.all([rp(someURL1), rp(someUrl2)]).then([r1, r2] => {
        // got all data now in r1 and r2
        res.render('index/asd', {r1, r2});
    }).catch(err => {
        console.log(err);
        res.sendStatus(500);
    });
});

在您完成res.update()之后,没有res.render()或任何方式可以在同一个响应对象上发送更多数据。完成res.render()并发送数据后,http连接即完成并关闭。您无法在其上发送更多数据。

可以调用res.render()获取不需要您的数据的模板,然后在浏览器中加载该网页后,它可以进行ajax调用以从服务器获取一些其他数据然后可以通过网页中的javascript插入到页面中。

在您发送原始回复后,无法将数据发送到之前的回复。

理论上可以使用res.write()在连接上发送数据,保持连接打开,然后再次使用res.write()在同一连接上发送更多数据,但这不是将在浏览器中呈现您的页面,然后在以后更新它 - 这就是浏览器的工作方式。

可以使用webSocket或socket.io连接将数据发送到网页(如果网页在加载到浏览器后创建了这样的连接),但我不知道这是如何应用的

我认为你有两个实用的选择:

  1. 等到你拥有所有数据后再等res.render()
  2. 在不需要您的数据的模板上调用res.render()。然后通过ajax调用将网页回调给服务器以检索数据,当它获取该数据时,它可以将其插入到页面中。
  3. 如果您的网页在浏览器中呈现并显示很久之后,您希望将一些更新的数据推送到网页,则可以使用webSocket或socket.io连接。使用该服务器然后,服务器可以在服务器上发生网页时发送更新,并且网页中的一些接收Javascript将基于新接收的数据手动修改当前网页显示。您通常会发送JSON数据,并让网页中的Javascript将其转换为页面中的HTML。

    这可行的方式如下:

    1. 在初始页面请求时,服务器使用res.render()呈现初始页面并将其发送到浏览器。
    2. 浏览器接收HTML页面,显示HTML并运行Javsacript。
    3. 页面中的Javascript,将webSocket或socket.io连接回服务器。
    4. 服务器接收webSocket或socket.io连接并挂起。
    5. 将来某个时候,服务器会将新数据发送到页面并制定消息(通常是JSON)并通过webSocket或socket.io连接发送。
    6. 网页中的Javascript接收来自服务器的传入消息,检查消息的内容并决定如何处理该数据 - 可能使用浏览器中的DOM操作将一些新数据插入当前显示的页面。