Поля в объекте ответа из метода извлечения не определены - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь написать рабочий сценарий cloudflare для домашнего задания. Мне нужно извлечь указанный URL, хранящийся в urls var в моем скрипте, который даст массив json из двух URL. Мне нужно сделать запрос на выборку к одному из URL-адресов в массиве, вот код, который я написал


addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})
/**
 * Respond with urls
 * @param {Request} request
 */
async function handleRequest(request) {

  var urls= await fetch('https://cfw-takehome.developers.workers.dev/api/variants')

 .then(function(res){

   return res;
})
var first=await urls.variants[0];
 return first;
}

И это JSON urls переменная conatains

{"variants":["https://cfw-takehome.developers.workers.dev/variants/1","https://cfw-takehome.developers.workers.dev/variants/2"]}

но я вижу, что когда я пытаюсь получить доступ к первому объекту в массиве, он не определен, так как я получаю эту ошибку

Uncaught (in response) TypeError: Cannot read property '0' of undefined

Пожалуйста, помогите мне найти причину этого и предложить решение. Я предполагаю, что я не понимаю некоторые понятия об асинхронном Javascript здесь.

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Я пробовал выше и единственное необходимое изменение - это возврат newResponse.

async function handleRequest() {
    var urls = await fetch('https://cfw-takehome.developers.workers.dev/api/variants')
     .then(response => response.json())
    var first = urls.variants[0];
    return new Response(first);
}
0 голосов
/ 16 апреля 2020

Вы сделали несколько ошибок здесь:

  • Во-первых, вам нужно вернуть res.json() вместо res, поскольку объект ответа, возвращаемый из fetch, не является фактический ответ и должен быть сериализован.

  • Второй - вам не нужен еще один await, так как он создаст ненужное обещание.

Итак, вот правильный код функции:

async function handleRequest() {
    var urls = await fetch('https://cfw-takehome.developers.workers.dev/api/variants')
     .then(res => res.json()) // res.json() instead just res
    var first = urls.variants[0]; // await removed
    return first;
}
...