Как вернуть ошибки в лямбда-функции AWS, написанной в Node.js, через шлюз API AWS с использованием инфраструктуры без сервера? - PullRequest
0 голосов
/ 16 ноября 2018

Я пишу API для внутреннего использования, и впервые я использую безсерверный фреймворк . Я пишу лямбда-функцию в Node.js и использую AWS API Gateway для подключения к ней.

В некоторых случаях я хочу вернуть пользовательское сообщение об ошибке, и я пытаюсь написать функцию, которая позволила бы мне это сделать. Прямо сейчас, каждый раз, когда происходит сбой лямбда-процесса, я получаю стандартное сообщение от API. В коде, если я пытаюсь завершить процесс, используя process.exit(1), я получаю общую ошибку, даже если я уже возвратил ошибку, используя callback():

{
    "message": "Internal server error"
}

Если я не использую process.exit(1), я вижу ошибку, которую я возвратил через callback() в журналах, но процесс продолжается, в конечном счете, по истечении времени:

{
    "message": "Endpoint request timed out"
}

Я пробовал несколько разных способов возврата ошибки, используя метод callback(), но до сих пор не увенчался успехом. Я пробовал этот метод:

async function return_error(callback, context, error, returnCode){
  console.error("FATAL ERROR: ", error);
  let ErrorObj = {
    errorType : "InternalServerError",
    httpStatus : 500,
    requestId : context.awsRequestId,
    errorMessage : error
}
  callback(JSON.stringify(ErrorObj));
  process.exit(1);
}

и вот этот:

async function return_error(callback, error, returnCode){
  console.error("FATAL ERROR: ", error);
  callback({
    isBase64Encoded: false,
    statusCode: returnCode,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({"Error Message:": error})
  }, null);
  process.exit(1);
}

(Извините за незначительные изменения синтаксиса между ними.)

До сих пор я не смог вернуть ошибку пользователю через API. Моя ошибка всегда регистрируется, и функция продолжается. Любая помощь будет оценена. Спасибо!

Для справки, соответствующие части моего файла serverless.yml:

service: #Name of service


provider:
  name: aws
  runtime: nodejs8.10
  role: #ARN of Iam role

functions:
  screenshot:
    handler: #Name of handler
    timeout: 30
    memorySize: 1280
    reservedConcurrency: 10
    events:
      - http: 
          method: get
          path: #path
          contentHandling: CONVERT_TO_BINARY
          authorizer:
            type: aws_iam

plugins:
  - serverless-plugin-chrome
  - serverless-apigw-binary
  - serverless-apigwy-binary
package:
  exclude:
    - node_modules/puppeteer/.local-chromium/** 

custom:
  apigwBinary:
    types:
      - '*/*'

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Обратные вызовы ошибок AWS для Node.js не работают так, как объявлено. Согласно docs все, что нужно сделать, это убедиться, что пользовательские ошибки расширяют прототип Error. Однако после более 10 часов тестирования я обнаружил, что это совершенно не соответствует действительности.

Единственный способ вернуть функцию обратного вызова с ошибкой, которая будет возвращать что-либо, кроме {"message": "Internal server error"} (т. Е. Если у вас есть функция Lambda, запущенная из шлюза API), это отозвать ошибку, как если бы она была успешной.

TL; DR: callback(errorResponse, null) не работает, но callback(null, errorResponse) работает.

0 голосов
/ 17 ноября 2018

Ваша лямбда-функция должна возвращать успех, чтобы APIgateway обнаружил ваш ответ.Попробуйте это:

async function return_error(callback, error, returnCode){
  console.error("FATAL ERROR: ", error);
  callback(null, {
    isBase64Encoded: false,
    statusCode: returnCode,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({"Error Message:": error})
  });
}
...