我正在尝试整合node.js的express框架和mysql模块https://npmjs.org/package/mysql。我已经通过使用express命令行建立了一个简单的应用程序,并且我还声明了一个模块来处理一些数据库属性。
我的DB模块设置如下:
在我的app.js文件中,我正在引用我的db模块并指定一些路由。我还尝试在客户端路由的app.get方法中使用路由中间件函数(estDb):
我不明白为什么我启动应用程序时我的模块导出会触发?我认为这就是我遇到麻烦的地方。
有什么建议或帮助将是非常棒的。
我的DB模块设置如下:
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'));
});
问题:我遇到的问题是似乎我的数据库函数(我的模块导出)在启动应用程序时被调用,因为我看到了日志:
Express server listening on port 3000
You are connected to mysql.
Mysql connection is terminated.
并不是当请求url http://localhost/clients
时(这是我定义的路由),才会执行下面的操作。正如您所看到的,它在控制台记录了“Express server listening on port 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
我不明白为什么我启动应用程序时我的模块导出会触发?我认为这就是我遇到麻烦的地方。
有什么建议或帮助将是非常棒的。
createConnection()
方法,而是随后的connect()
和end()
方法。我以为通过设置connect = connection.connect()
就可以将函数存储在变量中,但你指出需要使用connect = function(connection){ connection.connect(); }
。感谢你的建议。 - tthenne