2017-10-04 4 views
1

私は3つのファイルを持っています。 db.js,app.js,commentController.js。 私は自分のアプリケーションのすべての要求に私の接続を含めるので、何度も何度もコード接続を繰り返すことはありません。これは悪い/非安全な練習ですか?これを実装するためのより良い/適切な方法がありますか?NodeJSのすべてのリクエストに自分の接続を含めることはできますか?

db.js

const mysql = require('mysql'); 

const pool = mysql.createPool({ 
    host  : 'host', 
    user  : 'user', 
    password : 'password', 
    database : 'dbname' 
}); 

exports.pool = pool; 

app.js

const db = require('./db'); 

app.use((req, res, next) => { 
    req.pool = db.pool; 
    next(); 
}); 

commentController.js

exports.showComments = (req, res) => { 
    req.pool.getConnection((err, conn) => { 
    conn.query(`SELECT * FROM comments`, (err, results, fields) => { 
     conn.release(); 
     if (err) throw err; 

     res.render('comments', { results }); 
    }); 
    }); 
}; 
+1

なぜ 'commentController.js'は'直接プールをrequire'ないのですか? DIの形式ですか?しかし、私はあなたがテスト用データベースインタフェースをからかっを計画している場合、私はこれにいくつかの利点を見ることができるDI ... –

+0

を行うためのより良い方法があったと思うだろうが、それはロングショットだとより良い方法があります。 TJ Crowderが示唆しているように私はプールを直接必要とします – slezica

+1

あなたがやっていることの主な問題は、ルートファイルをあまり再利用できなくする依存関係を「隠す」ということです。また、 'db.pool'は実際に' req'オブジェクトに関連していないので、そこに格納されるべき正当なプログラミング上の理由はありません。 Markが答えているように、必要とするモジュールのdbモジュールで 'require()'だけを実行します。これは、ノードファイルを使用する方法であるコードに直接依存することを示します。はい、それは各ルートファイルで少し繰り返されたコードのようですが、それは依存関係を明示的に示していて、ノードファイル内で処理する方法です。 – jfriend00

答えて

3

あなただけREAの場合息子がこれをするのは、コードの複製を避けることです。それは悪い考えです。あなたのコードを見て(あるいはあなたが今年中にあなたのコードを見ている)人々は自然にDB接続がreqの財産であることを期待するつもりはありません。そして、あなたは本当に自分自身を救うことはできません。

だけrequire()ファイル内のデータベース・プールとそれを使用しています。

commentController.js

const db = require('./db'); 

require()は、すべてのモジュールに同じプールを返します。

あなたが接続を要求するのではなく(私はあなたが使用しているのlibに関するいくつかの仮定を作ってるんだ)プールを使用している理由も明らかではありません。

通常は行うことができる必要があります:

const db = require('./db'); 

exports.showComments = (req, res) => { 
    db.query(`SELECT * FROM comments`, (error, results, fields) => { 
     if (err) throw err; 
     res.render('comments', { results }); 
    }); 
}); 

これは、接続を要求し、返却の手間を節約し、ちょうどプールはそれが仕事だ行うことができます。

関連する問題