【问题标题】:Returning Promises from Netlify Function从 Netlify 函数返回 Promise
【发布时间】:2022-01-10 01:39:43
【问题描述】:

我正在开发一个托管在 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() 后没有返回任何内容,但我不确定如何最好地返回它。我仍然无法完全理解承诺。

我真的希望有人能指出我正确的方向。

非常感谢 大卫

【问题讨论】:

    标签: javascript es6-promise netlify mailchimp-api-v3.0 netlify-function


    【解决方案1】:

    您在正确的轨道上,提交函数中没有返回任何内容,因此响应将始终未定义。 此外,您正在使用 .then 和 async/await 语法,这是可以的,async/await 只是使用 Promise 的一种更简洁的方式,因此您通常使用其中一个。并且在这里嵌套 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 }),
          }
      }
    }

    如果您仍在为 promise 苦苦挣扎,我建议您阅读它们的文档以及 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

    【讨论】:

    • 太棒了,谢谢 Alexander,做了一些小的调整就成功了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多