#node.js
#node.js
Вопрос:
У меня проблемы с выборкой узла. API, к которому я отлично могу получить доступ в POSTMAN, выдает ту же ошибку, используя node-fetch, и я не могу заставить его выдать тело ответа. Я знаю, что он должен быть, и у меня есть теории, почему он, вероятно, неправильно отформатирован.
Вот мой код.
fetch(`apiUrl`, options)
.then((res) => {
console.log(res);
return res.text();
})
.then((res) => {
console.log(res);
})
.catch((err) => {
console.log(err);
});
Этот код никогда не печатает событие тела ответа после вызова res.text() . Мой вопрос: есть ли другой способ получить НЕОБРАБОТАННОЕ тело ответа, кроме call .text(), чтобы я мог видеть, отвечает ли API. Он отвечает статусом: 200, и я совершенно уверен, что есть тело, потому что, когда я выполняю cURL из PHP и запрашиваю POSTMAN, я получаю ожидаемое тело ответа.
Ошибки всегда:
Ошибка выборки: недопустимое тело ответа по адресу: apiUrl причина: неожиданный конец файла
Комментарии:
1. попробуйте использовать json вместо текста
2. он выдает ту же ошибку. Недопустимое тело ответа неожиданный конец файла
3. проверьте, является ли ответ, который вы получаете в postman, действительным json?, также попробуйте
await res.text()
4. Ответ, который я получаю от postman, является действительным JSON. По крайней мере, когда я бросаю его в . файл json и загрузка его в переменную node правильно преобразует его в объект. Вопрос все еще остается. Почему я не могу получить выборку, чтобы выдать необработанное тело. Почему это так сложно получить?
Ответ №1:
Итак, я собираюсь опубликовать ответ на этот вопрос, потому что он заслуживает ответа, и другие люди могут столкнуться с этим в конечном итоге. В принципе, вам нужно быть осторожным, что версия «fetch», упакованная с Express, не совсем совпадает с node-fetch. Они обрабатывают ошибки по-разному. В этом случае моей проблемой был пустой ответ, и в этом случае тело фактически не передавалось. экспресс-выборка выдает ошибку, которую я описал выше, однако node-fetch выдает понятную ошибку и возвращает тело ответа при вызове res.text() тело ответа просто пустое. В моем приложении я убедился, что всегда использую node-fetch, и это лучше. Не идеально, но по возможности избегайте использования зависимости экспресс-выборки.
Также по совпадению причина прерывистого пустого тела ответа, которое я получал, была связана с отсутствием заголовка соединения. Добавление «Connection: keep-alive» ко всем моим запросам устранило проблему, из-за которой API не завершал свой ответ.
Таким образом, это может быть вторичным ответом для обоих из них — добавить keep-alive ко всем вашим запросам API в качестве наилучшей практики, если только у вас нет причин не делать этого, чтобы избежать пустых тел ответа в ответе 200.