Netlify Lambda 函数

Netlify Lambda Functions

我在调用 Netlify 函数时遇到返回 502 错误的问题。我在 Axios 调用中是否做错了什么,或者回调中发送的 "error" 是否需要是实际的错误对象?

下面是我的函数的例子:

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))
    })
}

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

使用回调参数:

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

您将需要 return 在 callback 的第一个参数中出现错误,如您在 AWS documentation

中所见
callback(Error error, Object result);

如果不为空,则使用error,结果将被忽略。

使用异步处理程序:

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

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

您可以这样安排回复:

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

然后将其传递给回调 return 错误

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

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