我在节点 6.10 中有一个代码,它正在工作...... 但是如果我将其转换为节点 8.10,它不起作用
var mysql = require("mysql");
var connection = mysql.createConnection({
host: " localhost",
user: "root",
password: "",
database: "parser_db"
});
exports.handler = async event => {
connection.connect();
let response = {
statusCode: 400,
body: { Method: "Invalid", event }
};
var readTable = "SELECT * FROM documents where id = " + mysql.escape(1);
connection.query(readTable, function(err, results, fields) {
if (err) throw err;
else {
response = {
statusCode: 200,
body: { results }
//body: { results }
};
console.log(response);
return response;
}
});
};
有人可以帮我检测问题吗?如果我在单独的文件中执行 MySQL 查询并返回结果集,它也不起作用。
注意:如果我使用 console.log(response( 打印结果而不是返回它 显示正确的结果。
问题是你从connection.query((回调函数中返回响应。这使得响应成为回调函数的返回值,而不是外部 Lambda 函数的返回值。
重构此代码的一种方法如下:
exports.handler = async (event) => {
connection.connect();
return new Promise((resolve, reject) => {
const readTable = `SELECT * FROM documents where id = ${mysql.escape(1)}`;
connection.query(readTable, (err, results, fields) => {
if (err) {
reject(err);
} else {
resolve({statusCode: 200, body: {results}});
}
});
});
};
除了@jarmod的答案, 您还可以使用 util.promisify 方法来 promisifyconnection.query
这样您就可以使用await
关键字,使代码更简单
const util = require('util');
exports.handler = async (event) => {
connection.connect();
const readTable = `SELECT * FROM documents where id = ${mysql.escape(1)}`;
const connQueryPromisified = util.promisify(connection.query).bind(connection);
const result = await connQueryPromisified(readTable);
return {statusCode: 200, body: {results}};
};