筛选Node.js,Express和mysql模块

时间:2012-12-14 03:58:15

标签: mysql node.js express node-mysql

我正在尝试通过集成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

我不明白为什么在启动应用程序时我的模块导出会被触发?我认为这是我遇到麻烦的地方。

对此的任何建议或帮助都会很棒。

2 个答案:

答案 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放在一行(没有括号),则将会发生。