Есть ли способ обойти node-fetch res.text(), чтобы получить необработанное тело ответа?

#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.