【问题标题】:Node.js : How to do error handing in AWS Lambda?Node.js:如何在 AWS Lambda 中进行错误处理?
【发布时间】:2021-07-23 16:38:08
【问题描述】:

我正在使用 AWS Lambda API Gateway 开发一个 REST API。语言是 Node.js。

请检查以下代码。在那里我接受一个名为id 的参数,然后从数据库中获取数据并作为响应返回。

const mysql = require('mysql2');
const PropertiesReader = require('properties-reader');

const prop = PropertiesReader('properties.properties');

const con = mysql.createConnection({
  host     : prop.get('server.host'),
  user     : prop.get("server.username"),
  password : prop.get("server.password"),
  port     : prop.get("server.port"),
  database : prop.get("server.dbname")
});


exports.getMilestoneStatusByID = (event, context, callback) => {

  const { id } = event.queryStringParameters;
  console.log("id", id);

  // allows for using callbacks as finish/error-handlers
  context.callbackWaitsForEmptyEventLoop = false;
  const sql = "select * from milestone_status where idmilestone_status = ?";
  con.execute(sql, [id], function (err, result) {
    if (err) throw err;

    var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "body": JSON.stringify(result),
      "isBase64Encoded": false
    };
    callback(null, response)
  });
};

但是,在任何情况下,id 为 null 或未提供参数,然后用户将获得标准 AWS 错误输出 "message": "Internal server error"。但我需要的是传递 404 状态码,并带有消息Missing Parameters

我试图将handler 内的整个块放入try-catch 并尝试在catch 内触发以下代码

var response = {
      "statusCode": 404,
      "headers": {
        "Content-Type": "application/json"
      },
      "body": JSON.stringify("Missing Parameters"),
      "isBase64Encoded": false
    };
    callback(null, response)

但这些都没有阻止我收到标准的 AWS 错误消息,"message": "Internal server error"

如何实现我正在寻找的错误?

【问题讨论】:

  • 在这些情况下你是否看到了 lambda 调用? api网关是否已经拒绝请求? 如果代码确实被执行了,你不应该把它放在try-catch中,而是检查是否给出了id,然后做出相应的回复。
  • @luk2302:当代码在 try catch 中时,catch never 没有被执行。这就像response 被卡住了,因为POSTMAN 一直在运行而没有响应。你是对的。你能给我一个解决这个问题的代码示例吗?
  • @luk2302:无论如何,我实际上尝试通过尝试if(!id)来检查ID是否为空,但无论如何都会触发默认错误。

标签: javascript node.js error-handling aws-lambda aws-api-gateway


【解决方案1】:

我正在回答我自己的问题。问题不在于返回错误,而在于null 检查。这行得通。

exports.getMilestoneStatusByID =(事件、上下文、回调)=> {

const params = event.queryStringParameters;

if (!params || params.id == null) {
    var response = {
        "statusCode": 404,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": JSON.stringify({ error: "Missing Parameters" }),
        "isBase64Encoded": false
    };
    callback(null, response)
} else {
    const { id } = params;
    // ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 2023-04-07
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多