我正在尝试通过集成node.js的快速框架和mysql模块https://npmjs.org/package/mysql来完成工作。我有一个简单的应用程序设置(通过使用快速命令行),我还有一个声明用于处理某些数据库属性的模块。
我的数据库模块设置如下:
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
时 NOT (这是我将路由定义为)。正如您所看到的,它在控制台记录“Express服务器侦听端口3000”消息后立即触发db.connect()和db.end() - 这让我相信它是从自定义数据库模块触发的我正在使用。随后,当我去路线http://localhost/clients
时,我收到一个错误:
500 Error: Cannot enqueue Query after invoking quit.
如果我从db模块中删除connection.end()函数,我可以连接到数据库并检索结果;但是,如果我重新加载页面并尝试再次加载结果,我会收到错误:
Cannot enqueue Handshake after already enqueuing a Handshake
我不明白为什么在启动应用程序时我的模块导出会被触发?我认为这是我遇到麻烦的地方。
对此的任何建议或帮助都会很棒。
答案 0 :(得分:3)
我不明白为什么在启动应用程序时我的模块导出会被触发? 我认为这是我遇到麻烦的地方。
我相信这是因为这段代码而发生的事情:
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'database',
});
在这里,您实际上连接到数据库,而不是定义一个函数,而不是被调用时将连接到数据库。
答案 1 :(得分:2)
您的日志消息不是您从该代码获得的消息(没有“您已连接到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();
}
编辑:这里发生的是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
放在一行(没有括号),则无将会发生。