Работники Cloudflare ПОЛУЧАЮТ сообщение об ошибке типа Не удалось выполнить функцию

#javascript #post #fetch #cloudflare #cloudflare-workers

Вопрос:

Несколько человек поднимали вопросы, похожие на мои, в этом сообществе и сообществе cloudflare. Это все еще кажется в значительной степени нерешенным, поэтому я спрашиваю в надежде на решение.

Я пытаюсь создать функцию, позволяющую пользователям регистрироваться через mailchimp. Информация о пользователе передается от браузера к рабочим и почтовому шимпанзе. Я получаю следующие ошибки:

  1. Ошибка типа: Не удалось выполнить функцию: параметр 1 не относится к типу » Ответ’. в строке 0, col -2
  2. Запрос.Тело не читается

Запрос от Клиента:

         const response = await axios({
          method: "post",
          url: "http://127.0.0.1:8787/signup",
          data: {
            MERGE0: email,
            MERGE1: firstName,
            MERGE2: lastName,
          },
          headers: {
              "Content-Type": "application/json",
          }
        }); 

Работники часть 1 (функция для чтения тела запроса):
https://developers.cloudflare.com/workers/examples/read-post

 async function readRequestBody(request) {
  const { headers } = request
  const contentType = headers.get('content-type') || ''

  if (contentType.includes('application/json')) {
    return JSON.stringify(await request.json())
  } else if (contentType.includes('application/text')) {
    return request.text()
  } else if (contentType.includes('text/html')) {
    return request.text()
  } else if (contentType.includes('form')) {
    const formData = await request.formData()
    const body = {}
    for (const entry of formData.entries()) {
      body[entry[0]] = entry[1]
    }
    return JSON.stringify(body)
  } else {
    // Perhaps some other type of data was submitted in the form
    // like an image, or some other binary data.
    return 'a file'
  }
} 

Рабочие часть 2 (для отправки файла JSON в почтовый шимпанзе):
https://developers.cloudflare.com/workers/examples/post-json

 async function gatherResponse(response) {
  const { headers } = response
  const contentType = headers.get('content-type') || ''
  if (contentType.includes('application/json')) {
    return JSON.stringify(await response.json())
  } else if (contentType.includes('application/text')) {
    return response.text()
  } else if (contentType.includes('text/html')) {
    return response.text()
  } else {
    return response.text()
  }
} 

Работники Часть 3 (для обработки Почтового запроса):

 async function eventHandler(request) {
  const pathname = request.url

  try {
    if (pathname.indexOf('signup') !== -1) {
      const reqBody = await readRequestBody(request)
      const { MERGE0, MERGE1, MERGE2 } = reqBody

      // Construct req data
      const data = {
        members: [
          {
            email_address: MERGE0,
            status: 'subscribed',
            merge_fields: {
              FNAME: MERGE1,
              LNAME: MERGE2,
            },
          },
        ],
      }

      const postData = JSON.stringify(data)

      const options = {
        method: 'POST',
        headers: {
          Authorization: `auth ${MAILCHIMP_API_KEY}`,
        },
        body: postData,
      }

      const url = `https://us5.api.mailchimp.com/3.0/lists/${MAILCHIMP_AUDIENCE_ID}`
      const res = await fetch(url, options)
      const results = await gatherResponse(res)
      return results
    }
  } catch (err) {
    console.log(err)
  }
}

addEventListener('fetch', event => {
  event.respondWith(eventHandler(event.request))
}) 

Несколько других постов, на которые я ссылался:

Ответ №1:

У вас есть этот код:

 event.respondWith(eventHandler(event.request))
 

event.respondWith() Функция должна принимать Response объект в качестве своего параметра. Однако ваша eventHandler() функция не возвращает a Response . В некоторых случаях функция вообще не возвращает результат, а в других случаях она возвращает строку.

В тех случаях, когда вы не хотите изменять запрос/ответ, вы можете eventHandler передать запрос в источник следующим образом:

 return fetch(request);
 

В тех случаях, когда вы получили ответ от источника и хотите вернуть его непосредственно клиенту без изменений, вам следует просто return repsonse вместо return response.text() этого .

В тех случаях, когда вы создали какой-то новый текст ответа , который хотите вернуть, вам нужно завернуть его в Response , например:

 return new Respnose(text, {headers: {"Content-Type": "text/plain"}});