2013-10-20 262 views
0

我很好奇NodeJS导出模块的方式。我知道要导出一个方法,我们写出exports keyword.methodname。Node.js导出问题

然而,我的模块是一个连接:

//Require mysql connector that you installed with npm 
var mysql  = require('mysql'); 

var conn_conf = { 
    host  : 'localhost', 
    port  : 3306, 
    user  : 'root', 
    password : 'root', 
    database : 'nutrition_tracker' 
} 

var connection = mysql.createConnection(conn_conf); 

connection.connect(function(err) { 
    if(err) console.log("Could not connect to DB"); 
    else{ 
     console.log("Connected to "+conn_conf.database+' on '+conn_conf.host); 

    } 
}); 

然后需要它的文件中:

var db2 = require('../db/mysql_conn'); 

console.log(db2) 

但每次,DB2是{}。我不明白为什么 - 我不应该要求模块给我连接吗?我甚至尝试在模块中返回连接,但同样的事情 - db2是{}。

回答

0

在你的模块文件的末尾添加一行:

exports = module.exports = connection; 

注意,因为你不知道什么是你需要()调用返回的连接的状态你的方法是有缺陷的。您可能会在连接打开之前发送查询。

一个更好的办法是导出一个工厂函数:

exports = module.exports = function(cb) { 
    // your code as above 
    // ... 

    connection.connect(function(err) { 
    if(err) { 
     console.log("Could not connect to DB"); 
     cb(err); 
    } else { 
     console.log("Connected to "+conn_conf.database+' on '+conn_conf.host); 
     cb(null, connection); 
    } 
    }); 
}; 

而且使用这种方式:

var createDb = require('../db/mysql_conn'); 
createDb(function(err, db2) { 
    console.log(db2); 
}); 
+0

感谢。你能解释一下expors = module.exports =连接的东西吗?为什么没有它,我的工作就不行?谢谢。 – user2417731

+1

'exports = module.exports = connection'有点无用。唯一重要的部分是'module.exports = connection'。将它分配给'exports'变量只是意味着你可以使用它而不是在后面遍布整个地方输入'module.exports',但是因为你再也不会这么做了,所以它没用。 'exports'变量在当前模块中只是一个常规的全局变量。没有什么神奇的。 – slebetman

+0

@ user2417731一个很好的解释可以在文档中找到:http://nodejs.org/api/modules.html –