4

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

アプリケーションの起動時にモジュールのエクスポートが起動する理由がわかりません。ここが困ったところだと思います。

これに関する提案やヘルプは素晴らしいでしょう。

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.connect1 行 (括弧なし) で入力すると、何起こりません。

于 2012-12-14T06:50:25.390 に答える