无法重新初始化和 return 来自我的 catch 语句的错误响应
Unable to reinitialize and return error Response from my catch statement
在我的 lambda 节点代码中,我正在尝试调用我的 SQL 数据库并检索我的数据。
我正在使用 promises 并能够成功获取数据。但是,我无法按照要求实现错误处理。
我的要求是-
- 在 'function' 级别,我 return 通过 1 个变量进行响应。
- 有一个 catch 语句来捕获 Promise 链中的任何错误
- 如果出现错误,请将其包含并作为 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;
})
在我的 lambda 节点代码中,我正在尝试调用我的 SQL 数据库并检索我的数据。
我正在使用 promises 并能够成功获取数据。但是,我无法按照要求实现错误处理。
我的要求是-
- 在 'function' 级别,我 return 通过 1 个变量进行响应。
- 有一个 catch 语句来捕获 Promise 链中的任何错误
- 如果出现错误,请将其包含并作为 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;
})