2017-10-04 41 views
1

我有3個文件。 db.jsapp.jscommentController.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'''不需要'池直接?某種形式的DI?但我認爲有更好的方法去做DI ...... –

+0

如果你打算嘲笑數據庫接口進行測試,我可以看到一些好處,但這是一個很好的選擇,還有更好的方法。我會直接要求池,因爲TJ Crowder建議 – slezica

+1

你所做的主要問題是它「隱藏」了一個依賴項,使得你的路由文件不能重用。而且,由於'db.pool'實際上並不涉及'req'對象,所以沒有合法的編程原因應該將其存儲在那裏。正如Mark在他的回答中所說的那樣,只需要在任何需要它的模塊中的db模塊中使用require()。這直接在您的代碼中聲明依賴關係,這是對節點文件執行操作的方式。是的,它似乎是每個路徑文件中的一個重複的代碼,但這就是如何明確依賴關係並且是在節點文件中執行操作的方式。 – jfriend00

回答

3

如果你唯一的意圖兒子這樣做是爲了避免重複代碼,那麼我認爲這是一個壞主意。人們看着你的代碼(或者你在一年內查看你的代碼)並不希望數據庫連接成爲req的屬性。而且你真的沒有爲自己節省任何麻煩。

只需require()數據庫池中的文件並使用它。

commentController.js

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

require()將返回同一個池中所有的模塊。

這也不清楚爲什麼你要求連接,而不是使用池(我對你使用的庫做了一些假設)。

通常你應該能夠做到:

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

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

這節省了請求和返回連接的麻煩,只是讓池去做的工作。

相關問題