从 Netlify 函数返回承诺
Returning Promises from Netlify Function
我正在开发一个托管在 Netlify 上的无服务器功能,用于为用户订阅 mailchimp 电子邮件列表。
我收到以下模糊错误:
lambda response was undefined. check your function code again
这是我的函数:
const handler = async function (event, context) {
try {
let body = JSON.parse(event.body);
mailchimp.setConfig({
apiKey: 'XXXXXXXXX',
server: 'us20',
});
const submit = async () => {
const response = await mailchimp.lists.addListMember("XXXXXXXX", {
email_address: body.email.toLowerCase(),
status: 'subscribed'
});
if (response.errors !== undefined && response.errors.length) {
throw new Error(response.errors);
}
}
submit().then(response => {
console.log(response);
return {
statusCode: 200,
body: JSON.stringify({ response }),
}
}).catch(errors => {
return {
statusCode: 500,
body: JSON.stringify({ errors }),
}
});
} catch (error) {
// output to netlify function log
console.log(error);
return {
statusCode: 500,
// Could be a custom message or object i.e. JSON.stringify(err)
body: JSON.stringify({ msg: error.message }),
}
}
}
module.exports = { handler }
我认为问题可能是因为在调用 submit() 后没有任何内容被 return 编辑,但我不确定如何最好地 return 它。我仍然无法完全理解承诺。
我真的希望有人能给我指出正确的方向。
非常感谢
大卫
您走在正确的轨道上,提交函数中没有返回任何内容,因此响应始终是未定义的。
此外,您正在使用 .then 和 async/await 语法,这没问题,async/await 只是使用承诺的一种更简洁的方式,因此您通常会使用一个或另一个。并且不需要在此处嵌套 catch 块。我会把它改写成这样:
const handler = async function (event, context) {
try {
let body = JSON.parse(event.body);
mailchimp.setConfig({
apiKey: 'XXXXXXXXX',
server: 'us20',
});
const submit = async () => {
const response = await mailchimp.lists.addListMember("XXXXXXXX", {
email_address: body.email.toLowerCase(),
status: 'subscribed'
});
if (response.errors !== undefined && response.errors.length) {
throw new Error(response.errors);
}
return response;
}
const response = await submit();
return {
statusCode: 200,
body: JSON.stringify({ response }),
}
} catch (error) {
// output to netlify function log
console.log(error);
return {
statusCode: 500,
// Could be a custom message or object i.e. JSON.stringify(err)
body: JSON.stringify({ msg: error.message }),
}
}
}
如果您仍在为 promises 苦苦挣扎,我建议您阅读它们的文档以及 async/await 的文档。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
我正在开发一个托管在 Netlify 上的无服务器功能,用于为用户订阅 mailchimp 电子邮件列表。
我收到以下模糊错误:
lambda response was undefined. check your function code again
这是我的函数:
const handler = async function (event, context) {
try {
let body = JSON.parse(event.body);
mailchimp.setConfig({
apiKey: 'XXXXXXXXX',
server: 'us20',
});
const submit = async () => {
const response = await mailchimp.lists.addListMember("XXXXXXXX", {
email_address: body.email.toLowerCase(),
status: 'subscribed'
});
if (response.errors !== undefined && response.errors.length) {
throw new Error(response.errors);
}
}
submit().then(response => {
console.log(response);
return {
statusCode: 200,
body: JSON.stringify({ response }),
}
}).catch(errors => {
return {
statusCode: 500,
body: JSON.stringify({ errors }),
}
});
} catch (error) {
// output to netlify function log
console.log(error);
return {
statusCode: 500,
// Could be a custom message or object i.e. JSON.stringify(err)
body: JSON.stringify({ msg: error.message }),
}
}
}
module.exports = { handler }
我认为问题可能是因为在调用 submit() 后没有任何内容被 return 编辑,但我不确定如何最好地 return 它。我仍然无法完全理解承诺。
我真的希望有人能给我指出正确的方向。
非常感谢 大卫
您走在正确的轨道上,提交函数中没有返回任何内容,因此响应始终是未定义的。 此外,您正在使用 .then 和 async/await 语法,这没问题,async/await 只是使用承诺的一种更简洁的方式,因此您通常会使用一个或另一个。并且不需要在此处嵌套 catch 块。我会把它改写成这样:
const handler = async function (event, context) {
try {
let body = JSON.parse(event.body);
mailchimp.setConfig({
apiKey: 'XXXXXXXXX',
server: 'us20',
});
const submit = async () => {
const response = await mailchimp.lists.addListMember("XXXXXXXX", {
email_address: body.email.toLowerCase(),
status: 'subscribed'
});
if (response.errors !== undefined && response.errors.length) {
throw new Error(response.errors);
}
return response;
}
const response = await submit();
return {
statusCode: 200,
body: JSON.stringify({ response }),
}
} catch (error) {
// output to netlify function log
console.log(error);
return {
statusCode: 500,
// Could be a custom message or object i.e. JSON.stringify(err)
body: JSON.stringify({ msg: error.message }),
}
}
}
如果您仍在为 promises 苦苦挣扎,我建议您阅读它们的文档以及 async/await 的文档。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function