-1

我正在尝试为一个带回家的挑战编写一个 cloudflare worker 脚本。我需要urls在我的脚本中获取存储在 var 中的给定 url,这将给出一个包含两个 url 的 json 数组。我需要向数组中的一个 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;
}

这是 urls变量包含的 JSON

{"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 的一些概念。

4

2 回答 2

0

你在这里犯了几个错误:

  • 第一个是你需要 returnres.json()而不是 just 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;
}
于 2020-04-16T10:16:09.910 回答
0

我已经在上面尝试过,唯一需要的更改是返回 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);
}
于 2020-04-21T07:57:11.833 回答