Я пишу 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:
- '*/*'