Получил JS - получить оба атрибута ответа и JSON тело - PullRequest
0 голосов
/ 18 апреля 2020

Я хочу проверить, что моя конечная точка возвращает статус ошибки 404 и что тело имеет некоторое свойство. Получил JS поддержку режима JSON, который автоматически анализирует тело, но у меня нет атрибутов HTTP. Могу ли я это как-то совместить? Или мне нужно самому разобрать JSON? Я особенно не понимаю, что метод json() когда-то работает, а затем не определен.

Тест

data = await bff("polls/abc").json();
console.log(data);
console.log(data.success);
response = await bff("polls/abc");
console.log(response.body);
console.log(response.json());

Вывод

console.log test/polls.int.test.js:96
{ success: false }

console.log test/polls.int.test.js:97
false

console.log test/polls.int.test.js:99
{"success":false}

TypeError: response.json is not a function

Почему нет этих двух вариантов эквивалент?

await bff("polls/abc").json()

и

response = await bff("polls/abc");
response.json();

Обновление: определение bff

const bff = got.extend({
    prefixUrl: "http://localhost:3000/bff/",
    throwHttpErrors: false,
    headers: {
        "content-type": "application/json; charset=utf-8'"
    },
});

Решение Кенгеля

response = await bff("polls/abc", { responseType: 'json' });
console.log(response.body.success);
console.log(response.statusCode);

console.log test/polls.int.test.js:98
false

console.log test/polls.int.test.js:99
404

1 Ответ

1 голос
/ 18 апреля 2020

Вы не можете выполнить

response = await bff("polls/abc");
response.json();

, потому что функция json() является асинхронной, точно так же как bff, и она возвращает обещание, а также должна ожидаться.

Чтобы понять, почему вызов await bff("polls/abc").json() работает, мы должны проанализировать его. Прежде всего, await - это не , ожидающий bff("polls/abc") (который возвращает обещание), а вызов json().

Но подождите: если bff() возвращает обещание почему bff().json() работает? Разве bff() не следует ожидать первым?

Строка в документации got может дать ответ:

Обещание также имеет .text (),. Методы json () и .buffer (), которые возвращают другое полученное обещание для проанализированного тела.

Таким образом, обещание, возвращаемое bff(), на самом деле не является "истинным" обещанием, но имеет эти три удобные методы, чтобы вы не тоже ожидали bff(), если вы получаете ответ только как JSON. Но поскольку вы do действительно хотите посмотреть и на сам ответ, вы должны вместо этого сделать следующее:

const promise = bff("polls/abc");
const response = await promise;
const data = await promise.json();

if (response.status === 404) {
   ...
}

Другой способ, похоже, установить responseType в " json ", который должен автоматически преобразовывать тело в JSON, так что вам вообще не придется вызывать json() вручную, и вы можете просто использовать:

const response = await bff("polls/abc", { responseType: 'json' });

if (response.status === 404) {
   // use response.body to access the converted json
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...