Обещание узла, кажется, обманывают данные, некоторые выглядят как буфер? - PullRequest
0 голосов
/ 21 апреля 2020

Я делаю асин c https запрос. Я получаю данные обратно, но кажется, что они поступают, а не возвращаются как один ответ от сервера. Некоторые из них даже кажутся возвращающимися в качестве буфера. Кто-нибудь видел что-нибудь подобное?

Я пытаюсь понять, почему асин c 'на данных' приходит по частям. Сервер настроен для доставки одного ответа обратно.


//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

1 Ответ

0 голосов
/ 21 апреля 2020

data события в потоках (которые не находятся в объектном режиме) содержат произвольный объем данных. Вы можете получить все свои данные из потока в одном data событии или в целой куче data событий. Это несколько аналогично чтению потока TCP (поскольку базовый протокол HTTP использует только поток TCP), где данные поступают в произвольных порциях.

Сколько кусков поступает в него, связано с целым рядом факторов, ни один из которых вы не контролируете, включая:

  • Как отправитель отправляет данные
  • Как быстро сетевое соединение отправителя
  • Как быстро inte rnet связь между вами и отправителем
  • Как быстро ваш компьютер может получать данные из сети
  • Что может случиться с данными, когда они пересекают целое число rnet, чтобы добраться до вас

И так далее ...

Итак, если вы действительно просто хотите ВСЕ данные, тогда вам нужно собрать все данные в событиях data, объединить их вместе, а затем в событии end вы будете знать, что теперь у вас есть ВСЕ данные.

Если вы хотите, чтобы значимые фрагменты данных были вместе Кстати, тогда вам придется анализировать данные по мере их поступления, чтобы вы могли найти границы некоторого значимого объема данных (например, линий или какой-либо другой границы объекта). И вы должны быть готовы к тому, что вы можете получить частичную часть данных, должны буферизовать эти частичные данные до тех пор, пока остальная часть не поступит в следующее событие данных. Это то, как вы делаете инкрементальный анализ входящих потоков.

То, что data событие приходит из входящего потока. В зависимости от того, как настроен поток, событие data предложит либо объект Buffer (который выглядит как ваш), либо строку.

...