2014-05-09 55 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

相关问题