2012-05-26 141 views
0

所以這裏有一個簡單的問題。基本上我正在製作一個連接到MySQL服務器的快速應用程序。很簡單。但是,我如何停止添加文件之間的所有連接代碼,以便在更改密碼或數據庫時不必更改多個文件。Node.js DRY與MySQL客戶端

例子:

app.coffee

client = mysql.createClient 
    user: config.db.user, 
    password: config.db.pass 

app.get '/', routes.index 

routes/index.coffee

client = mysql.createClient 
    user: config.db.user, 
    password: config.db.pass 

exports.index = (req, res) -> 
    res.render 'index' 

我試圖創建一個名爲lib/mysql.coffee文件,該文件是這樣的:

config = require '../config' 
mysql = require 'mysql' 

module.exports = (-> 
    mysql.createClient 
    host: config.db.host 
    user: config.db.user 
    password: config.db.pass 
    database: config.db.name 
) 

因此,在應用程序,我可以去:

mysql = require './lib/mysql' 
mysql.query 'SHOW TABLES', (err,r,f) -> 
    console.log err 

但它一直給:

TypeError: Object function() { 
    return mysql.createClient({ 
     host: config.db.host, 
     user: config.db.user, 
     password: config.db.pass, 
     database: config.db.name 
    }); 
    } has no method 'query' 

模塊:https://github.com/felixge/node-mysql

回答

1

我的節點福是不是強大,但這樣的:

module.exports = (-> 
    mysql.createClient 
    ... 
) 

正在導出返回MySQL連接的函數。您的錯誤消息:

TypeError: Object function() { 
    return mysql.createClient({ 
     ... 
    }); 
    } has no method 'query' 

說盡可能多;那說mysql是沒有query方法的函數對象。

你可以繼續做你正在做的事情,並說:

mysql = require './lib/mysql' 
db = mysql() 
db.query 'SHOW TABLES', (err,r,f) -> 
    console.log err 

或者你可以導出connect方法:

module.exports = 
    connect: -> 
    mysql.createClient(...) 

和使用:

mysql = require './lib/mysql' 
db = mysql.connect() 
db.query ... 
2

權現在您正在導出該函數並且沒有返回值。

顯然,你可以創建在CoffeeScript中的do關鍵字自動執行功能,所以試試這個:

module.exports = do (-> 
    mysql.createClient 
    host: config.db.host 
    user: config.db.user 
    password: config.db.pass 
    database: config.db.name 
) 

或者做什麼µ is too short suggests並調用導出函數。無論如何,這將是更清潔。