Nodejs res.end () [и другие версии отправки ответа, такие как res.write () и т. Д.) Не отправляют полную строку, разрываясь между - PullRequest
0 голосов
/ 05 июля 2018

Сценарий

Я создаю сервер nodejs, который будет выполнять роль промежуточного сервера между фактическим клиентом и фактическим сервером. я отправляю запрос на веб-сайт через мой сервер nodejs, получаю ответ от фактического (веб-сайта) сервера и пересылаю его клиенту (браузеру).

Вот часть кода для этого

const cheerio   = require('cheerio');

//#================================================================
// include other files and declare variables
//#================================================================

app.get('/*', (req, res) => {

    //#================================================================
    // some code...
    //#================================================================

    request(options, function(error, response, body){
        if (!error && response.statusCode == 200) {
            res.writeHead(200, headers);

            if (String(response.headers['content-type']).indexOf('text/html') !== -1){
                var $ = cheerio.load(body);

                //#================================================
                // perform html manipulations
                //#================================================

                //send the html content as response
                res.end($.html());

            }else{
                res.end(body);
            }

        }else{
            res.send({status: 500, error: error});
        }
    });
}

Все работает нормально, пока я не наткнулся на этот конкретный сайт https://www.voonik.com/recommendations/bright-cotton-a-line-kurta-for-women-blue-printed-bcown-007b-38-1f2073ca.

Если вы посмотрите на его источник, он более или менее похож на это

<!doctype html>
<html lang="en-in" data-reactid=".mc12nbyapk" data-react-checksum="-2121099716">
<!-- rest of the html code -->
...
<script type="text/javascript" charset="UTF-8" data-reactid=".mc12nbyapk.1.1">
window.NREUM||(NREUM={});NREUM.info = {"agent":"","beacon":"bam.nr-data.net","errorBeacon":"bam.nr-data.net"...
...
</script></body></html>

и когда я отправляю этот самый html в свой объект ответа, он отправляет неполные html, т.е. разрывы между где-то последним тегом скрипта.

Я также утешил журнал html, и он печатает всю строку. Но отправка того же в ответе объекта отправляет половину.

Также пробовал res.write (); res.send () и сохранение содержимого html в переменной, а затем отправка этой переменной, но результат такой же, то есть неполное содержимое html.

Я думал о решении, которое не включало бы запись в файл и чтение из него. Просто отправьте ответ сразу после его получения

1 Ответ

0 голосов
/ 05 июля 2018

после того, как вы измените содержимое ответа целевого сервера, длина содержимого изменится, поэтому вы должны пересчитать длину содержимого и переписать заголовок длины содержимого или просто удалить заголовок длины содержимого,

поставьте этот код delete headers['content-length'] перед res.writeHead(200, headers); этой строкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...