通过Node.js,Express和mysql模块进行筛选

我正在尝试通过将node.js和mysql模块https://npmjs.org/package/mysql的快速框架集成起来。 我有一个简单的应用程序设置(通过使用快速命令行),我也有一个模块声明与一些数据库属性的工作。

我的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被请求(这是我定义的路由)。 正如你所看到的,在控制台logging“监听端口3000上的Express服务器”消息之后,它立即触发了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 

我不明白为什么我的模块导出正在触发,当我启动应用程序? 我认为这是我陷入困境的地方。

任何build议或帮助,这将是伟大的。

我不明白为什么我的模块导出正在触发,当我启动应用程序? 我认为这是我陷入困境的地方。

我相信这是因为这段代码而发生的:

 var mysql = require('mysql'); var connection = mysql.createConnection({ host: 'localhost', user: 'user', password: 'password', database: 'database', }); 

在这里你实际上是连接到数据库 ,而不是定义一个函数 ,而不是被调用的时候会连接到数据库

你的日志消息不是你从代码中得到的(没有“你连接到mysql”)! 尝试以下操作:

 db.connect; 

应该

 db.connect(); 

因为你想执行该function。 在执行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() ,如我的post所示(对于end() )。 如果你把db.connect放在一行(没有括号), 什么都不会发生。