我是NodeJS的新手,我正在努力寻找一个解决方案来创建一个可重用的函数来执行查询(通过参数传递),然后简单地将响应返回给调用者。我想这样做,因为将有超过100个函数需要数据库查询,它将有助于减少代码大小。
我尝试了以下作为非常原始的测试,但dbA_Read_Data()函数始终返回undefined
,因为它是异步的。然而,6天之后,超过15种替代回调/承诺解决方案对某些人起作用并没有对我有用,我也没有更接近解决这个问题并完成以下任务。
const { Databases } = require('../../utils/enums');
var mysql = require('mysql');
function getAllUsers() {
//This function would be called when an endpoint is hit in my HapiJS system.
var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' ";
var response = dbA_Read_Data(myQuery);
return response;
}
//dbA => website database, contains users/permissions/etc
//Other databases... you get the idea
function dbA_Read_Data(query) {
dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password);
dbConn.connect();
dbConn.query(query, function(err, rows, fields) {
if (err) throw err;
var myResponseObject = {
query: query,
data: {
count: rows.length,
records: rows
}
}
});
}
function createConnection(host, database, user, password) {
var connection = mysql.createConnection({
host: host,
user: user,
password: password,
database: database
});
return connection;
}
如何让函数dbA_Read_Data(query)
将响应对象返回给调用函数?
答案 0 :(得分:1)
与注释部分一样,数据库调用conn.query
是异步的,因此无法简单地返回结果。为了获得此查询的结果并对其进行操作,您可以使用Promise。
我认为你的dbA_Read_Data(query)
函数看起来像这样:
function dbA_Read_Data(query){
var dbConn = createConnection("localhost", Databases.db_A.name, Databases.db_A.username, Databases.db_A.password);
dbConn.connect();
return new Promise(function(resolve, reject){
dbConn.query(query, function(err, rows, fields) {
if ( err ) {
reject(err);
} else {
var myResponseObject = {
query: query,
data: {
count: rows.length,
records: rows
}
}
resolve(myResponseObject);
}
});
});
}
然后,您的getAllUsers()
函数调用需要.then()
才能获得结果:
function getAllUsers(){
var myQuery = "SELECT * FROM Users WHERE Account_Status== 'ACTIVE' ";
return dbA_Read_Data(myQuery).then(function(result){
return result;
}).catch(function(error){
// handle the error properly here...
console.log('error in database operation');
});
}
getAllUsers().then(function(users){
// do something with the result...
console.log(users);
});