возврат данных из базы данных в контроллер - PullRequest
2 голосов
/ 11 июля 2019

Я строю новый API в Express с использованием архитектуры MVC, и я не могу получить данные для возврата в файл контроллеров из файла доступа к базе данных.

Я начал это, пытаясь использовать функции обратного вызова, а затем переключился на обещания, но я почти уверен, что что-то упускаю из-за областей, вызывающих мою проблему.Я снова и снова ломал голову над Google и работал над этим пару дней, но безрезультатно.

// Это код файла контроллера

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;

1 Ответ

0 голосов
/ 11 июля 2019

Причина, по которой это не сработало, заключалась в том, что вы возвращались только во внутреннем обратном вызове.Вам также нужно было вернуться во внешний обратный вызов.У данных не было пути возврата, чтобы вернуться к вызываемому объекту (например, к контроллеру).Поскольку вы упомянули async / await, я переписал это, чтобы отразить современный синтаксис 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, как показано ниже.Вы можете использовать синтаксис обратного вызова, который вы используете в настоящее время, но вы не сможете использовать приведенный ниже код, не изменив его.Я думаю, что синтаксис 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});
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...