Как скачать, изменить и обслуживать удаленную страницу - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать http-сервер, который будет загружать HTML на https://google.com и обслуживать его (по адресу 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)

Кажется, что загружен html с google.com, но сервер вылетает с этой ошибкой:

Error: Can't set headers after they are sent.

Я понимаю, что это связано с 2-мя завернутыми запросами, но я не знаю, как это исправить.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

В вашем коде аргумент 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)
0 голосов
/ 31 мая 2018

@ 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)
0 голосов
/ 31 мая 2018

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

...