场景
我正在创建一个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内容。
我在考虑解决方案,该方案不涉及写入和读取文件。只需在收到回复后直接发送回复
答案 0 :(得分:0)
在处理目标服务器响应内容之后,内容长度会更改,因此必须重新计算内容长度并重写content-length标头,或者只是删除content-length标头,
将此代码delete headers['content-length']
放在此行res.writeHead(200, headers);
之前。