Lambda 函数 MySQL 结果在 NodeJs 8.10 上不起作用



我在节点 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}};
};

最新更新