gpt4 book ai didi

javascript - 将数据从数据库返回到 Controller

转载 作者:行者123 更新时间:2023-11-29 03:15:50 25 4
gpt4 key购买 nike

我正在使用 MVC 架构在 Express 中构建一个新的 API,但我无法从数据库访问文件中获取数据以返回到 Controller 文件。

我开始尝试使用回调函数,然后切换到 promise ,但我很确定我遗漏了导致我出现问题的范围的某些内容。我和谷歌一遍又一遍地绞尽脑汁,为此工作了几天无济于事。

//这是 Controller 文件代码

let bodyparser = require('body-parser');
const dbUtilities = require('../db/db.js');

let controller = {
retrieveTables: function(req, res){
database = req.params.database;
query = ["SHOW TABLES FROM " +database +";"];
connectDb(query, database, function(results){
res.render('dashboard', {data: results});
console.log('results from controller' + results);
});
},

//这是我的 db.js 文件,用于处理从 mysql 中检索数据

var mysql = require('mysql');

//generalized utility db functions
//function to open a db connection

//opening the connection to the database
connectDb = function(query, database){
resultData = [];
var connectionPromise = dbConnect(database);
connectionPromise.then(function(connection){
for(var i = 0; i < query.length; i++){
var queryPromise = buildQuery(connection, query[i]);
queryPromise.then(function(result){
console.log('QUERY' + i + ': ' + query[i]);
console.log(result);
resultData.push(result);
if(resultData.length == query.length){
dbDisconnect(connection);
return(resultData);
}
})
}
});

//opening the db connection
function dbConnect(database){
return new Promise(function(resolve, reject){
var connection = mysql.createConnection({
host : 'localhost',
user : 'rcg',
password: '8693ViaMallorca',
database: database
});

connection.connect(function(err) {
if(err) {
console.error('error connecting: ' + err.stack);
reject(error);
}
else{
console.log('connected as id ' + connection.threadID);
resolve(connection);
}
});
});
}

//building the query promise function
function buildQuery(connection, query){
return new Promise(function(resolve, reject){
connection.query(query, function(error, results, fields){
if(error){
console.error('error retrieving the query');
console.log(query);
reject(error);
}
else{
resolve(results);
};
});
});
}

//closing the connection to the database
function dbDisconnect(connection){
connection.end(function(err) {
if(err) {
console.error('error terminating connection');
return(error);
}
else{
return(console.log('connection successfully terminated'));
}
});
}

}
module.exports = connectDb;

最佳答案

这不起作用的原因是因为您仅在内部回调中返回。您也需要返回外部回调。数据没有返回路径返回到被调用者(例如: Controller )。由于您提到了 async/await,我重写了它以反射(reflect)现代 async/await 语法。

const connectDb = async function(query, database){  
resultArray = [];
const connection = await dbConnect(database);

for(let i = 0; i < query.length; i++) {
const result = await buildQuery(connection, query[i]);
console.log(result);
resultArray.push(result);
}
return resultArray;
});

我重写了它以使用与下面相同的异步/等待语法。您可以使用您当前正在使用的回调语法,但如果不更改它,您将无法使用下面的代码。我认为 async/await 语法更直接。将 res.render 作为函数中的最后一件事也很重要(因为它作为回调表示您已完成请求处理)。

const controller = {
retrieveTables: async function(req, res) {
const database = req.params.database;
const query = ["SHOW TABLES FROM " + database + ";"];

const results = await connectDb(query, database);
console.log('results from controller', results);
res.render('dashboard', {data: results});
}
}

关于javascript - 将数据从数据库返回到 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56995562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com