Просеивание через узел.модуль 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 4

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 в одну строку (без скобок), ничего не произойдет.