簡體   English   中英

從數據庫返回數據到控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM