4

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

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

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

4

2 回答 2

3

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

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

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

在这里,您实际上是连接到数据库,而不是定义一个函数,而不是在调用时将连接到数据库

于 2012-12-14T14:50:39.913 回答
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输入一行(不带括号),什么都不会发生。

于 2012-12-14T06:50:25.390 回答