2014-05-09 64 views
1

我是新來的節點,並嘗試爲我的應用程序獲得一個好的設計模式。 我做了一個模塊,通過要求創建池在應用程序中初始化一個mysql池並在模塊中重用

var mysql = require('mysql'); 

var pool = mysql.createPool({ 
    host  : 'host', 
    user  : 'user', 
    password : 'pwd', 
    database : 'db' 
}); 

exports.pool = pool; 

這我可以在我的模塊中重用:

var db = require('./db').pool; 

現在我想設置在app.js池的選項,東西模塊像:

var mysql = require('mysql'); 

var pool = mysql.createPool(options); 

exports.pool = pool; 

...在app.js我最初將要成立這個池:

ar options = {...} 

var db = require('./db').pool(options); 

但這不起作用。我在想什麼錯了?

+0

這解決了我的問題 [http://stackoverflow.com/questions/20598430/how-do-i-use-the-same-mysql-connections-for-my-entire-node-js-應用] [1] [1]:http://stackoverflow.com/questions/20598430/how-do-i-use-the-same-mysql-connections-for-my-entire-node -js-app – marschro

回答

0

您可以使用下面的模式來初始化池一次,然後通過應用程序的其餘部分輕鬆地引用它:

db.js

var mysql = require('mysql'); 

module.exports = { 
    init: function(name, options) { 
     return module.exports[name] = mysql.createPool(options); 
    } 
}; 

app.js

var options = {...} 
var db = require('./db').init("pool1", options); // initialise once 

東西,else.js

var db = require('./db').pool1; // references the pool created in app.js 

然後,您可以還可以創建其他池的其他數據庫。

+0

這真的很棒!謝謝!我會試試這個。 – marschro

0

在我看來,你想要require('./db').pool引用一個工廠函數來創建你的池。

更改db.js喜歡的東西:

var mysql = require('mysql'); 

exports.pool = function(options){ 
    return mysql.createPool(options); 
}; 

然後你就可以在你的選項傳遞從app.js因爲你已經做的:

var options = {...} 
var db = require('./db').pool(options); 
+0

是的,謝謝。但是這不會在整個追加模塊中持續存在。如果我從另一個文件調用池,則選項將丟失。在不包含單個文件的應用程序中處理mysql的最佳策略是什麼?在每個模塊(或文件)中創建一個新的池似乎效率低下。任何提示? – marschro

+0

初始化並參考始終?有點像服務提供商模式?我會在一分鐘內創建一個新的答案。 – Mikuso

相關問題