[英]returning data from db up to controller
我正在使用MVC架構在Express中構建新的API,但無法獲取數據以從數據庫訪問文件返回至控制器文件。
我從嘗試使用回調函數開始,然后切換到Promise,但是我很確定我遺漏了導致問題的范圍。 我已經一遍又一遍地動腦筋,也為谷歌付出了努力,並為此工作了幾天,但都無濟於事。
//這是控制器文件代碼
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;
之所以不起作用,是因為您僅在內部回調中返回。 您還需要返回外部回調。 數據沒有返回路徑可以返回被調用方(例如:控制器)。 由於您提到了異步/等待,因此我重新編寫了此代碼以反映現代的異步/等待語法。
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語法。 您可以使用當前使用的回調語法,但是如果不更改它,將無法使用下面的代碼。 我認為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});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.