0

私は Node.js の初心者ですが、MySQL をグローバル変数として使用しても問題ありませんか?

内部にこのコードを含む db_helper.js があります。

global.client = require('mysql').createConnection({
    user: '__mysqluser__',
    password: '__mysqlpass__',
    database: '__mysqldb__',
    timezone: '-03:00'
});
global.client.connect();

私のmain.jsでは、次のことを行います:

require('db_helper');

次に、他の js ファイルで、UPDATE または SELECT が必要なときはいつでも次のように呼び出します。

global.client(query, data);

このようなコードはまだ見たことがありませんが、期待どおりに動作しますが、ページをリロードするときにランダムにクラッシュすることがあります。

こんな使い方でいいの?クラッシュは、DB への接続方法に関連していますか?

クラッシュが発生したのは、MySQL がデータを返さないためですが、次のように結果を解析するときにクラッシュが発生するため、関連していると思います。

global.client.query(query, function(err, results, fields) {
   if (err) throw err;
   if (results && Object.prototype.toString.call(results) === '[object Array]') {
      var j = result[0].data; 
   }
}

ほとんどの場合、var jは期待どおりの値を持っていますが、ノードがクラッシュすると、以前に (結果の) 一貫性をチェックしていたにもかかわらず、この var は空を返します。次のように言ってノードがクラッシュします。

result[0].data is undefined

ありがとう。

編集:クライアントの js ファイルがサーバー上で更新されるたびに、クラッシュが発生します。(.js ファイルをローカルで編集し、FTP 経由でサーバーにアップロードした後)、なぜですか?

4

1 に答える 1

5

より一般的なアプローチは、ものを保存する代わりにglobal(あいまいなコード、IMOになります)、それをエクスポートすることです:

// db_helper.js
var client = module.exports = require('mysql').createConnection({
    user: '__mysqluser__',
    password: '__mysqlpass__',
    database: '__mysqldb__',
    timezone: '-03:00'
});
client.connect();

// somewhere else
var client = require('db_helper');

コードがクラッシュする理由は、空の配列をチェックしていないためです。

client.query(query, function(err, results, fields) {
   if (err) throw err;
   if (results.length) { // don't need to check if it's an array
     var j = results[0].data;
     ...
   }
}

理由としては、実行しているクエリがサーバー上で異なる結果を返す (または結果がない) と思います。

于 2013-07-17T20:27:25.360 に答える