2014-01-14 152 views
1

我有兩個node.js文件:server.js和database.js。我想我的socket.io發射發生在server.js和database.js中的數據庫查詢中。 Server.js:將node.js-mysql結果返回給函數

// init 
io.sockets.on('connection', function(socket) { 
    initdb = db.initdb(); 
    console.log(initdb) 
}); 

我database.js主要包含以下代碼:

function query(queryString) { 
    connection = mysql.createConnection({ 
     host: '12.23.45.67', 
     user: 'user', 
     password: 'password', 
     database: 'database' 
    }); 

    connection.connect(); 

    var res = connection.query(queryString, function(err, rows, fields) { 
     if (err) throw err; 
    }); 

    connection.end(); 
} 


// export initdb for external usage by server.js 
exports.initdb = function() { 
    var initdb = query("SELECT * FROM columns;"); 
}; 

我的問題是,我想行從connection.query函數內對象返回到我在initdb功能。然而,我可以登錄這個對象的唯一地方是在這個函數中。我如何傳遞查詢結果,以便從server.js發出JSON對象呢?

回答

4

請記住,節點是異步的。因此,大部分情況下,通過回調而不是返回值函數返回數據。

你會通過你的查詢碰巧在那裏需要鏈的回調,是這樣的:

// in database.js 
exports.initdb = function(cb) { 
    query("SELECT * FROM columns", cb) 
} 

function query(queryString, cb) { 
    // .. stuff omitted 

    var res = connection.query(queryString, function(err, rows, fields) { 
    connection.end(); 
    if (err) return cb(err); 
    cb(null,rows); 
    }); 

// in server.js 
io.sockets.on('connection', function(socket) { 
    db.initdb(function(err,rows) { 
    if (err) { 
     // do something with the error 
    } else { 
     console.log(rows) 
    } 
    }); 
}); 

回調將採取2個參數,errrows功能。你的server.js代碼將需要檢查err的值並採取相應的行動,否則將有rows

+2

這是我的第一個node.js項目。沒有得到這個重要部分。非常感謝juanpaco! – Dani

+0

嘿,你打賭。我們都去過那裏。 :)如果你只是在學習,你可能會在我在http://learnallthenodes.com上做的一個截屏視頻系列中找到一些價值。無論你是否簽出,快樂的編碼! – juanpaco