如何下载,修改和提供远程页面

时间:2018-05-31 12:05:04

标签: node.js express https http-proxy

我尝试创建一个将在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个包装请求有关,但我不知道如何修复它。

3 个答案:

答案 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)