#javascript #post #fetch #cloudflare #cloudflare-workers
Вопрос:
Несколько человек поднимали вопросы, похожие на мои, в этом сообществе и сообществе cloudflare. Это все еще кажется в значительной степени нерешенным, поэтому я спрашиваю в надежде на решение.
Я пытаюсь создать функцию, позволяющую пользователям регистрироваться через mailchimp. Информация о пользователе передается от браузера к рабочим и почтовому шимпанзе. Я получаю следующие ошибки:
- Ошибка типа: Не удалось выполнить функцию: параметр 1 не относится к типу » Ответ’. в строке 0, col -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"}});