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'));
});
私が抱えている問題は、ログを取得しているときにアプリケーションを起動すると、db 関数 (モジュールのエクスポート) が呼び出されているように見えることです。
Express server listening on port 3000
You are connected to mysql.
Mysql connection is terminated.
URLが要求されたときではありませんhttp://localhost/clients
(これは、ルートが定義されているものです)。ご覧のとおり、コンソールが「ポート 3000 でリッスンしている Express サーバー」というメッセージをログに記録した直後に、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
アプリケーションの起動時にモジュールのエクスポートが起動する理由がわかりません。ここが困ったところだと思います。
これに関する提案やヘルプは素晴らしいでしょう。