我正在尝试通过集成 node.js 的 express 框架和 mysql 模块https://npmjs.org/package/mysql来工作。我有一个简单的应用程序设置(通过使用 express 命令行),并且我还声明了一个用于处理某些数据库属性的模块。
我的数据库模块是这样设置的:
app.js
node_modules
|___db
|
node_modules
|___mysql
将 mysql 模块设置为 db 模块的依赖项。
在我的 db 模块的 index.js 中,我有一些模块导出设置可供应用程序访问:
/*
* 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,
}
在我的 app.js 文件中,我需要我的 db 模块并指定一些路由。我还尝试在客户端路由的 app.get 方法中使用路由中间件函数(estDb):
/**
* 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'));
});
我遇到的问题 是,当我在获取日志时启动应用程序时,似乎调用了我的 db 函数(我的模块导出):
Express server listening on port 3000
You are connected to mysql.
Mysql connection is terminated.
不是在请求 url 时http://localhost/clients
(这是我定义的路由)。如您所见,它在控制台记录“Express 服务器正在侦听端口 3000”消息后立即触发 db.connect() 和 db.end() - 这让我相信它是从自定义 db 模块触发的我正在使用。随后,当我去路线时,http://localhost/clients
我得到一个错误:
500 Error: Cannot enqueue Query after invoking quit.
如果我从 db 模块中删除 connection.end() 函数,我可以连接到数据库并检索结果;但是,如果我重新加载页面并尝试再次加载结果,则会出现错误:
Cannot enqueue Handshake after already enqueuing a Handshake
我不明白为什么我的模块导出在我启动应用程序时会触发?我想这就是我遇到麻烦的地方。
对此的任何建议或帮助都会很棒。