Nodejs res.end()[和其他发送响应的版本,如res.write()等]没有发送完整的字符串,在

时间:2018-07-05 05:54:27

标签: node.js html5 response

场景

我正在创建一个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 :(得分:0)

在处理目标服务器响应内容之后,内容长度会更改,因此必须重新计算内容长度并重写content-length标头,或者只是删除content-length标头,

将此代码delete headers['content-length']放在此行res.writeHead(200, headers);之前。