所以我的问题是我需要将一些数据从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)这样的东西?
答案 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连接将数据发送到网页(如果网页在加载到浏览器后创建了这样的连接),但我不知道这是如何应用的
我认为你有两个实用的选择:
res.render()
。res.render()
。然后通过ajax调用将网页回调给服务器以检索数据,当它获取该数据时,它可以将其插入到页面中。如果您的网页在浏览器中呈现并显示很久之后,您希望将一些更新的数据推送到网页,则可以使用webSocket或socket.io连接。使用该服务器然后,服务器可以在服务器上发生网页时发送更新,并且网页中的一些接收Javascript将基于新接收的数据手动修改当前网页显示。您通常会发送JSON数据,并让网页中的Javascript将其转换为页面中的HTML。
这可行的方式如下:
res.render()
呈现初始页面并将其发送到浏览器。