简体   繁体   English

从数据库返回数据到控制器

[英]returning data from db up to controller

I am building a new API in Express using an MVC architecture and I cannot get the data to return to the controllers file from the db access file. 我正在使用MVC架构在Express中构建新的API,但无法获取数据以从数据库访问文件返回至控制器文件。

I started this out trying to use callback functions and then switched to promises, but i'm pretty sure I am missing something about the scopes that is causing my problem. 我从尝试使用回调函数开始,然后切换到Promise,但是我很确定我遗漏了导致问题的范围。 I have racked my brain as well as Google over and over and worked on this for a couple days to no avail. 我已经一遍又一遍地动脑筋,也为谷歌付出了努力,并为此工作了几天,但都无济于事。

//This is the controllers file code //这是控制器文件代码

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);
    });
  },

//This is my db.js file that handles data retrieval from mysql //这是我的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;

The reason why this wasn't working was because you were returning only in the inner callback. 之所以不起作用,是因为您仅在内部回调中返回。 You needed to return in outer callback too. 您还需要返回外部回调。 The data had no return path to get back to the callee (eg: the controller). 数据没有返回路径可以返回被调用方(例如:控制器)。 Since you mentioned async/await, I re-wrote this to reflect modern async/await syntax. 由于您提到了异步/等待,因此我重新编写了此代码以反映现代的异步/等待语法。

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;
});

I re-wrote this to use the same async/await syntax as below. 我将其重新编写为使用与下面相同的async / await语法。 You could use the callback syntax you're currently using, but you wouldn't be able to use the code below without changing it. 您可以使用当前使用的回调语法,但是如果不更改它,将无法使用下面的代码。 I think the async/await syntax is more straightforward. 我认为async / await语法更简单。 It's also important that you have res.render as the last thing in your function (since it's signifying as a callback that you're done processing the request). 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