Вот мой сценарий:
Я хочу получить некоторый внешний ресурс (двоичный файл) с помощью библиотеки request и передать его клиенту моего собственного приложения. Если код ответа! = 200 или возникают проблемы с удаленным сервером, я хочу перехватить и вместо этого предоставить пользовательское сообщение об ошибке. В идеале, если ответ в порядке, я хочу, чтобы оригинальные заголовки были сохранены.
Мне удалось достичь этого с помощью первого фрагмента кода, который я вставил ниже. Тем не менее, все мое приложение основано на API Promise, поэтому я хотел сделать его согласованным и обернуть его в обещание. И когда я это делаю, это больше не работает. Во-первых, я пытался добиться этого с request-обещанием , но безуспешно. Затем я попытался самостоятельно подготовить очень простой пример, но все же безуспешно.
Рабочий пример
var r = request.get('http://foo.bar');
r.on('response', result => {
if (result.statusCode === 200) {
r.pipe(res);
} else {
res.status(500).send('custom error message')
}
});
r.on('error', error => res.status(500).send('custom error message');
Пример не работает
var r;
return new Promise((resolve, reject) => {
r = request.get('http://foo.bar');
r.on('response', result => {
if (result.statusCode === 200) {
resolve();
} else {
reject()
}
});
r.on('error', reject);
}).then(() => {
r.pipe(res);
}).catch(() => {
res.status(500).json('custom error message');
});
Под «не работает» я имею в виду - ответ не доставлен, запрос находится на рассмотрении до истечения времени ожидания.
Я изменил код для вызова .pipe()
, если результат передан resolve
вместо r
. Он отвечает клиенту, но тогда ответ пуст.
В конце я попытался заменить запрос lib просто http.get()
. И с этим сервер возвращает файл клиенту, но заголовки (например, Content-Type
или Content-Length
) отсутствуют.
Я много гуглил, пробовал несколько версий запросов ... и ничего не работает.