Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将异步数据推送到NodeJS中查看_Node.js_Express_Asynchronous - Fatal编程技术网

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

Node.js 将异步数据推送到NodeJS中查看,node.js,express,asynchronous,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.rend

所以我的问题是,我需要将一些数据从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)

我可以在异步请求后推送数据而不等待它吗?比如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.render()
之后,没有像
res.update()
这样的事情,也没有任何方法可以在同一响应对象上发送更多数据。一旦
res.render()
完成并发送了数据,http连接就完成并关闭。你不能发送更多的数据


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

在发送原始响应后,无法向上一个响应发送数据

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

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


我认为你有两个切实可行的选择:

  • 等待调用
    res.render()
    ,直到获得所有数据
  • 在不需要数据的模板上调用
    res.render()
    。然后使用ajax调用将web页面回调到服务器以检索数据,当它获取数据时,它可以将数据插入页面

  • 如果在浏览器中呈现和显示网页很久之后,您希望将一些更新的数据推送到网页,则可以使用webSocket或socket.io连接。使用该方法,服务器可以在更新发生在服务器上时向网页发送更新,网页中的一些接收Javascript将根据新接收的数据手动修改当前网页显示。您通常会发送JSON数据,并让web页面中的Javascript在页面中将其转换为HTML

    其工作方式如下:

  • 在初始页面请求时,服务器使用
    res.render()
    呈现初始页面并将其发送到浏览器
  • 浏览器接收HTML页面,显示HTML并运行脚本
  • 页面中的Javascript,使webSocket或socket.io连接回服务器
  • 服务器接收webSocket或socket.io连接并挂起
  • 在将来的某个时候,服务器会将新数据发送到页面,并生成一条消息(通常是JSON),然后通过webSocket或socket.io连接发送该消息
  • 网页中的Javascript接收来自服务器的传入消息,检查消息的内容并决定如何处理该数据——可能使用浏览器中的DOM操作将一些新数据插入当前显示的页面
  • 我可以在异步请求后推送数据而不等待它吗?比如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.render()
    之后,没有像
    res.update()
    这样的事情,也没有任何方法可以在同一响应对象上发送更多数据。一旦
    res.render()
    完成并发送了数据,http连接就完成并关闭。你不能发送更多的数据


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

    在发送原始响应后,无法向上一个响应发送数据

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

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


    我认为你有两个切实可行的选择:

  • 等待调用
    res.render()
    ,直到获得所有数据
  • 在不需要数据的模板上调用
    res.render()
    。然后使用ajax调用将web页面回调到服务器以检索数据,当它获取数据时,它可以将数据插入页面

  • 如果在浏览器中呈现和显示网页很久之后,您希望将一些更新的数据推送到网页,则可以使用webSocket或socket.io连接。使用该选项,服务器可以将更新发送到