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