Просеивание через узел.модуль js, Express и mysql
Я пытаюсь работать через интеграцию express framework для node.js и модуль mysql https://npmjs.org/package/mysql . у меня есть простая настройка приложения (с помощью командной строки express), а также модуль, объявленный для работы с некоторыми свойствами базы данных.
Мой модуль БД настроен следующим образом:
app.js
node_modules
|___db
     |
     node_modules
           |___mysql
С установкой модуля mysql, чтобы быть зависимостью модуля db.
В моем указателе.js для модуля db у меня есть некоторый модуль экспорт настроек, чтобы получить доступ к приложения:
/*
 * Connection params for database
 */
var mysql = require('mysql');
var connection = mysql.createConnection({
  host: 'localhost',
  user: 'user',
  password: 'password',
  database: 'database',
});
var connect = connection.connect(function(err){
  if(!err){
        console.log("You are connected to the database.");
  }
  else{
        throw err;
  }
});
var end = connection.end(function(err){
  if(!err){
        console.log("Mysql connection is terminated.")
  }
  else{
        throw err;
  }
});
module.exports = {
  connect: connect,
  connection: connection,
  end: end,
}
В моем приложении.файл js мне требуется мой модуль БД и указание некоторых маршрутов. Я также пытаюсь использовать функцию Route middleware (estDb) внутри приложения.метод get для маршрута клиентов:
/**
 * Module dependencies.
 */
var express = require('express')
  , routes = require('./routes')
  , clients = require('./routes/clients')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , db = require('db');
var app = express();
app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});
app.configure('development', function(){
  app.use(express.errorHandler());
});
var estDb = function(req, res, next){
  db.connect;
  db.connection.query("SELECT * FROM Table", function(err, results){
        if(!err){
          req.results = results;
        }
        else{
          throw err;
        }
  });
  db.end;
  next();
}
app.get('/', routes.index);
app.get('/clients', estDb, clients.view);
http.createServer(app).listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});
Проблема Мне кажется, что мои функции БД (экспорт моего модуля) вызываются при запуске приложения, когда я получаю журнал:
Express server listening on port 3000
You are connected to mysql.
Mysql connection is terminated.
Не  , когда url http://localhost/clients является запрошено (что является тем, что у меня есть маршрут, определенный как).  Как видите, он стреляет из БД.connect () и БД.end() сразу после того, как консоль регистрирует сообщение "Express server listening on port 3000" - что заставляет меня думать, что оно запускается из пользовательского модуля db, который я использую.  Впоследствии, когда я иду по маршруту http://localhost/clients, я получаю ошибку: 
500 Error: Cannot enqueue Query after invoking quit.
Если я удалю соединение.функция end() из модуля db, я могу подключиться к базе данных и получить результаты; однако, если я перезагрузил страница и попытаться загрузить результаты снова, я получаю ошибку:
Cannot enqueue Handshake after already enqueuing a Handshake
Я не понимаю, почему мой модуль экспорта срабатывает, когда я запускаю приложение? Я думаю, что именно здесь у меня будут неприятности.
Любые предложения или помощь по этому вопросу были бы великолепны.2 ответа:
Я не понимаю, почему мой модуль экспорта срабатывает, когда я запускаю приложение? Я думаю, что именно здесь у меня будут неприятности.
Я считаю, что это происходит из-за этого фрагмента кода:
var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'database', });Здесь вы фактически подключаетесь к базе данных , а не определяете функцию, которая при вызове будет подключаться к базе данных.
Ваше сообщение журнала не является тем, которое вы получаете из этого кода (нет никакого "вы подключены к mysql")!? Попробуйте следующее:
db.connect;Должно быть
db.connect();Потому что вы хотите выполнить функцию. Вы также хотите дождаться завершения запроса перед выполнением
next()var estDb = function(req, res, next){ db.connect(); db.connection.query("SELECT * FROM Table", function(err, results){ if(!err){ req.results = results; next(); } else{ throw err; } }); db.end(); }EDIT: здесь происходит то, что код в вашем модуле
dbвыполняется сразу же, когда это требуется. Вы хотите сделать вот что:var connect = function(){ connection.connect(function(err){ if(!err){ console.log("You are connected to the database."); } else{ throw err; } }) };Затем вы можете вызвать
db.connect(), как показано в моем сообщение (то же самое дляend()). Если вы поместитеdb.connectв одну строку (без скобок), ничего не произойдет.