节点承诺似乎在欺骗数据,有些看起来像缓冲区



我正在进行一个异步https请求。我正在取回数据,但它似乎是慢慢传入的,而不是作为服务器的单个响应返回。其中一些甚至看起来像是作为某种缓冲回来了。有人见过这样的东西吗?

我正在努力理解异步"on data"是否会支离破碎。服务器设置为返回单个响应。


//Start JS File

var port = process.env.PORT || 3000,
http = require('http'),
fs = require('fs'),
https = require('https'),
html = fs.readFileSync('index.html');
const server = http.createServer();
server.on('request', async (req, res) => {
let myPromise = new Promise((resolve, reject) => {
const data = JSON.stringify({
someData:'someData'
});
const options = {
hostname: 'gs.aURL.com',
port: 443,
path: '/openrtb2/auction',
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'Content-Length': data.length,
Accept: '*/*',
pragma: 'no-cache',
'User-Agent':
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
Cookie:
'uids=eyJ0ZW1wVUlEcyI6eyIzM2Fjcm9zcyI6eyJ1aWQiOiIyMTAyNDE4OTIxOTc2MTciLCJleHBpcmVzIjoiMjAyMC0wMy0yN1QyMTo1MToyOC42MDkxNjEyODZaIn0sImFkbnhzIjp7InVpZCI6IjY3ODE0NTEzMjgzOTg1NTE3MDkiLCJleHBpcmVzIjoiMjAyMC0wMy0yN1QyMTo1MTozMy41Mjg0OTgzMjhaIn0sInB1bHNlcG9pbnQiOnsidWlkIjoiOE1WYlRlMTRQSFhVIiwiZXhwaXJlcyI6IjIwMjAtMDMtMjdUMjE6NTE6MzMuMTI5NDI2NjIyWiJ9fSwiYmRheSI6IjIwMjAtMDMtMTNUMjE6NTE6MjguNjA5MTU1MThaIn0=',
origin: 'https://lab.fizz.org'
}
};
const adRequest = https.request(options, (adResponse) => {
//console.log(`statusCode: ${res.statusCode}`);
adResponse.on('data', (d) => {
console.log(typeof d);
res.write(d);
resolve(d);
});
});
adRequest.on('error', (error) => {
reject(error);
});
adRequest.write(data);
adRequest.end();
})
.then((result) => {
console.log(result);
res.write(result);
req.end();
})
.catch((error) => {
//res.write(error);
//req.end();
});
});
// Listen on port 3000, IP defaults to 127.0.0.1
server.listen(port);
// Put a friendly message on the terminal
console.log('Server running at http://127.0.0.1:' + port + '/');
//END JS File

Output to terminal (from console.log(typeof d)):
====================================================================

object
<Buffer 7b 22 69 64 22 3a 22 66 39 34 35 64 34 64 65 2d 33 36 61 37 2d 34 38 65 37 2d 38 64 65 64 2d 35 62 63 63 61 66 32 35 39 37 66 36 22 2c 22 73 65 61 74 ... >
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
object
流(非对象模式(上的data事件包含任意数量的数据。您可以在一个data事件中从流中获取所有数据,也可以在一大堆data事件中获取数据。这在某种程度上类似于读取TCP流(因为底层http协议只是使用TCP流(,其中数据以任意块的形式到达。

它到达的块数与一大堆因素有关,这些因素你都无法控制,包括:

  • 发件人如何发送数据
  • 发件人的网络连接速度
  • 你和发件人之间的互联网链接有多快
  • 您的计算机从网络获取数据的速度
  • 当数据通过互联网到达你身边时,它可能会发生什么

等等…

因此,如果你真的只想要所有的数据,那么你需要收集data事件中的所有数据,将其组合在一起,然后在end事件中,你就会知道你现在拥有了所有的数据。

如果你想要一路上有意义的数据片段,那么你必须在数据进入时解析数据,这样你就可以找到一些有意义数据量的边界(比如线或其他对象边界(。而且,您必须做好准备,可能会收到部分数据,必须缓冲该部分数据,直到下一个数据事件中出现其余数据。这就是对传入流进行增量解析的方法。

data事件来自传入流。根据流的配置方式,data事件将提供一个Buffer对象(看起来像您的对象(或一个String。

相关内容

最新更新