我尝试创建一个将在https://google.com
下载HTML的http服务器
并服务它(在localhost:3000)。一种代理。
使用此代码:
const express = require('express')
const https = require('https')
const app = express()
app.get('/', function (req, mainRes) {
https.get('https://www.google.fr', (res) => {
res.on('data', (d) => {
mainRes.send(d)
})
})
})
app.listen(3000)
google.com上的html似乎已下载,但服务器因此错误而崩溃:
Error: Can't set headers after they are sent.
我理解它与2个包装请求有关,但我不知道如何修复它。
答案 0 :(得分:1)
在您的代码中,参数res
是一个流(请参阅https.get
的文档)。
目前,您每次通过该流接收到块时都会尝试发送完整的响应。因此,您收到错误Can't set headers after they are sent.
,因为第二次调用mainRes.send()
时您尝试再次发送整个响应。 (请参阅明文' res.send
的文档。)
您希望通过快速响应对象传递res
,因为这也是一个流:
const express = require('express')
const https = require('https')
const app = express()
app.get('/', function (req, mainRes) {
https.get('https://www.google.fr', (res) => {
mainRes.pipe(res)
})
})
app.listen(3000)
答案 1 :(得分:0)
我不是100%肯定你的情况,但我建议你添加一个调试器声明并逐步完成它。
答案 2 :(得分:0)
@sdgluck&& @ kwesi1337帮助我找到了解决方案,我需要从data
事件中连接所有块:
const express = require('express')
const https = require('https')
const app = express()
let data = ''
app.get('/', function (req, mainRes) {
https.get('https://www.google.fr', (res) => {
res.on('data', (chunk) => {
data += chunk;
})
res.on('end', () => {
mainRes.end(data);
});
})
})
app.listen(3000)