无法重新初始化和 return 来自我的 catch 语句的错误响应

Unable to reinitialize and return error Response from my catch statement

在我的 lambda 节点代码中,我正在尝试调用我的 SQL 数据库并检索我的数据。

我正在使用 promises 并能够成功获取数据。但是,我无法按照要求实现错误处理。

我的要求是-

  1. 在 'function' 级别,我 return 通过 1 个变量进行响应。
  2. 有一个 catch 语句来捕获 Promise 链中的任何错误
  3. 如果出现错误,请将其包含并作为 JSON 对象发回。

下面是我的代码:

'use script';
const mysql = require('mysql');
let res, SQL;

module.exports = async (event, context, callback) => {
    const connection = mysql.createConnection ({
        host: process.env.HOST,
        user: process.env.DBUSER,
        password: process.env.DBPASSWORD,
        database: process.env.INSTANCE,
        port: process.env.PORT,
        connectionLimit: process.env.CONNECTION_LIMIT,   
        multipleStatements: false
    });

    SQL = ` SELECT 
                *
            FROM
                supplie
            WHERE
                isActive=1;`;
                    
    await new Promise( (resolve, reject) => {
    
        connection.connect(function (err) {   
                if (err) { console.log(err); }        
        
            connection.query(SQL, (err, result) => {
                console.log(err);
                resolve(result);
            });
        });
    }).then( (result, err ) => {
        {
            res = {
                "statusCode" : 200,
                "body": JSON.stringify(result),
                "headers"  : {
                    "Access-Control-Allow-Origin" : "*"
                }
            };
            return res;   
        }
    }).catch ( err => {
        console.error('Something Went Wrong');
        console.log(err);
        res = {
            "statusCode" : 404,
            "body": JSON.stringify('Something went wrong!'),
            "headers"  : {
                "Access-Control-Allow-Origin" : "*"
            }
        };
        throw err;
    }).finally( () => {
        return new Promise((resolve, reject) => {
            connection.end(error => error ? reject(error) : resolve());
        });
    });
    // returning response to the function
    return res;
};

下面是日志和输出: 回应:

{
  "statusCode": 200,
  "headers": {
    "Access-Control-Allow-Origin": "*"
  }
}

请求 ID:

"1fc0c996-8e75-4c0d-b9c9-3757db0a4809"

Function logs:
START RequestId: 1fc0c996-8e75-4c0d-b9c9-3757db0a4809 Version: $LATEST
2020-07-22T17:46:21.117Z    1fc0c996-8e75-4c0d-b9c9-3757db0a4809    INFO    Error: ER_NO_SUCH_TABLE: Table 'supplier_svc_db_dev.supplie' doesn't exist
    at Query.Sequence._packetToError (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
    at Query.ErrorPacket (/var/task/node_modules/mysql/lib/protocol/sequences/Query.js:79:18)
    at Protocol._parsePacket (/var/task/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/var/task/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/var/task/node_modules/mysql/lib/protocol/Parser.js:43:10)
    at Protocol.write (/var/task/node_modules/mysql/lib/protocol/Protocol.js:38:16)
    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:88:28)
    at Socket.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:526:10)
    at Socket.emit (events.js:310:20)
    at addChunk (_stream_readable.js:286:12)
    --------------------
    at Protocol._enqueue (/var/task/node_modules/mysql/lib/protocol/Protocol.js:144:48)
    at Connection.query (/var/task/node_modules/mysql/lib/Connection.js:198:25)
    at Handshake.<anonymous> (/var/task/helpers/testPromise.js:28:24)
    at Handshake.<anonymous> (/var/task/node_modules/mysql/lib/Connection.js:526:10)
    at Handshake._callback (/var/task/node_modules/mysql/lib/Connection.js:488:16)
    at Handshake.Sequence.end (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
    at Handshake.Sequence.OkPacket (/var/task/node_modules/mysql/lib/protocol/sequences/Sequence.js:92:8)
    at Protocol._parsePacket (/var/task/node_modules/mysql/lib/protocol/Protocol.js:291:23)
    at Parser._parsePacket (/var/task/node_modules/mysql/lib/protocol/Parser.js:433:10)
    at Parser.write (/var/task/node_modules/mysql/lib/protocol/Parser.js:43:10) {
  code: 'ER_NO_SUCH_TABLE',
  errno: 1146,
  sqlMessage: "Table 'supplier_svc_db_dev.supplie' doesn't exist",
  sqlState: '42S02',
  index: 0,
  sql: ' SELECT \n' +
    '                *\n' +
    '            FROM\n' +
    '                supplie\n' +
    '            WHERE\n' +
    '                isActive=1;'
}
END RequestId: 1fc0c996-8e75-4c0d-b9c9-3757db0a4809
REPORT RequestId: 1fc0c996-8e75-4c0d-b9c9-3757db0a4809  Duration: 805.03 ms Billed Duration: 900 ms Memory Size: 1024 MB    Max Memory Used: 74 MB  Init Duration: 142.20 ms    

预期输出:

    {
        "statusCode" : 404,
        "body": JSON.stringify('Something went wrong!'),
        "headers"  : {
            "Access-Control-Allow-Origin" : "*"
        }
    };

如有任何帮助,我们将不胜感激。

热烈的问候, 阿迪

如果出现错误,您需要拒绝承诺:

connection.query(SQL, (err, result) => {
                if(err) {
                  return reject(err);
                }
                resolve(result);
            });

您还需要 return 在 catch 块中重新处理而不是重新抛出错误:

.catch ( err => {
        console.error('Something Went Wrong');
        console.log(err);
        res = {
            "statusCode" : 404,
            "body": JSON.stringify('Something went wrong!'),
            "headers"  : {
                "Access-Control-Allow-Origin" : "*"
            }
        };
        return res;
    })