【问题标题】:Netlify Lambda FunctionsNetlify Lambda 函数
【发布时间】:2018-08-04 00:43:27
【问题描述】:

当我调用我的 Netlify 函数时,我遇到了返回 502 错误的问题。我在 Axios 调用中做错了什么还是在回调中发送的“错误”需要是一个实际的错误对象?

下面是我的函数示例:

const axios = require('axios')
require('dotenv').config()
const https = require('https')
const headers = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': 'Content-Type'
}

exports.handler = function (event, context, callback) {
  // your server-side functionality

  axios
    .post(
      `https://us18.api.mailchimp.com/3.0/lists/${
        process.env.LIST_ID
      }/members/`, {
        email_address: 'deuce3608@gmail.com',
        status: 'subscribed'
      }, {
        auth: {
          username: 'admin',
          password: process.env.MAILCHIMP_API_KEY
        }
      }
    )
    .then(response => {
      callback(null, {
        statusCode: 200,
        headers,
        body: response.data
      })
    })
    .catch(err => {
      callback(JSON.stringify(err.response.data))
    })
}

【问题讨论】:

    标签: aws-lambda axios netlify


    【解决方案1】:

    Netlify announced in April (2018) Node.js 8.10 将是 Netlify 函数中的默认值。

    使用回调参数:

    当您需要使用回调参数在Lambda functions on Netlify 中返回错误时,它将与 AWS 的 Lambda 函数格式相同。

    您需要在callback 的第一个参数中返回一个错误,正如您在AWS documentation 中看到的那样

    callback(Error error, Object result);
    

    error 不为 null 时使用,结果将被忽略。

    使用异步处理程序:

    您还可以选择在响应中使用错误状态代码返回您的错误,如下面的示例函数。

    import fetch from "node-fetch";
    
    const API_ENDPOINT =
      "https://08ad1pao69.execute-api.us-east-1.amazonaws.com/dev/random_joke";
    
    exports.handler = async (event, context) => {
      return fetch(API_ENDPOINT)
        .then(response => response.json())
        .then(data => ({
          statusCode: 200,
          body: `${data.setup} ${data.punchline} *BA DUM TSSS*`
        }))
        .catch(error => ({ statusCode: 422, body: String(error) }));
    };
    

    显示简单的测试

    错误

    exports.handler = function(event, context, callback) {
      const err = new Error("this is an error")
      callback(err);
    }
    

    响应(响应状态码 502):

    {"errorMessage":"this is an error","errorType":"Error","stackTrace":["48.exports.handler (/var/task/showerror.js:75:13)"]}
    

    对象

    exports.handler = function(event, context, callback) {
      const err = {statusCode: 422, body: "this is an error"}
      callback(err);
    }
    

    响应(响应状态码 502):

    {"errorMessage":"[object Object]"}
    

    字符串

    exports.handler = function(event, context, callback) {
      const err = "this is an error"
      callback(err);
    }
    

    响应(响应状态码 502):

    {"errorMessage":"this is an error"}
    

    注意:

    如果您想使用回调并在响应中包含错误状态代码,您只需将其传递给响应的对象即可。

    exports.handler = function(event, context, callback) {
      const err = {statusCode: 422, body: "this is an error"}
      callback(null, err);
    }
    

    响应(响应状态码 422):

    this is an error
    

    【讨论】:

    • 所以它不能只是返回任何 ol 对象吗?它必须是一个错误对象吗?如果我理解正确?
    • 我没有测试任何对象,但是从文档中它只是传递了错误(第一个参数)以在使用回调函数时填充到响应中。
    • 我使用ErrorObjectStringcallback 的Netlify 函数中进行了测试,并将其添加到答案中。我还包括了结果的传递,所以你可以看到它如何返回给定的状态代码。
    【解决方案2】:

    你可以这样安排回复:

    var response = {
        statusCode: 4xx
        body: ''
    }
    

    然后将其传递给回调以返回错误

    response.body = 'some error text here';
    callback(response);
    

    他们正在使用 AWS Lambda,因此如果您可以在控制台中执行此操作,理论上您应该能够以相同的方式调用事物,因为他们正在获取您的代码并通过 Cloudformation 在他们的基础设施中部署它。

    【讨论】:

      猜你喜欢
      • 2020-05-01
      • 2021-08-04
      • 1970-01-01
      • 2020-12-17
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多