2013-08-03 74 views
0

我在node.js Express服務器中有這個app.get爲什麼在node.js中調用函數時會得到一個空對象?

app.get('/api/court/:num', function(req, res, next) { 
    var courts = new CourtsHandler; 
    if (req.params.num == 0) //get array of all courts 
     return res.send(200, courts.courtsAmount());   
    }); 

這是調用這個函數:

this.courtsAmount = function(){ 
    connection.query('SELECT COUNT(*) AS result from courts', function(err, rows, fields){ 
     if (err) throw err; 
     connection.end(); 
     console.log(rows[0].result); 
     return rows[0].result; 
     }); 
    }; 

的courtsAmount函數獲取調用。但在我的客戶看來,我沒有得到回報。相反,我只是得到一個空的對象。

我認爲這與我的.query有一個回調這一事實有關,因此res.sendcourtsAmount實際上被觸發之前發送了一個空對象。

我該如何解決這個問題?

+0

您將無法有效地從''rows' return'數據因爲'connection.query()'是異步的。欲瞭解更多信息,結帳http://stackoverflow.com/q/14220321。它使用的示例是使用jQuery的Ajax,但該問題和許多解決方案可以應用於任何異步任務。 –

回答

1

您的法院帳戶不會返還任何東西。相反,你應該使用回調裏面(或承諾),做這樣的事情:

this.courtsAmount = function(callback){ 
connection.query('SELECT COUNT(*) AS result from courts', function(err, rows, fields){ 
    if (err) throw err; 
    connection.end(); 
    console.log(rows[0].result); 
    callback(rows[0].result); 
    }); 
    }; 

而且

app.get('/api/court/:num', function(req, res, next) { 
var courts = new CourtsHandler; 
if (req.params.num == 0) //get array of all courts 
    courts.courtsAmount(function(result) { res.send(200, result) }); 
}); 
+0

謝謝!整理出來。 請問你能告訴我爲什麼在我看到的大多數例子中,res.send總是以返回爲前提?在我的情況下, 沒有必要使用返回。 和我的問題可以解決事件而不是回調? – lobengula3rd

+0

由於我還沒有看到這些例子,所以不能確定返回的結果,但我猜想這是因爲返回的結果會保證函數在該行之後不會繼續。我不確定你想如何取代事件回調。你可以使用事件,但你仍然需要回調我想。如果你不喜歡回調,你仍然可以切換到承諾 – axelcdv

相關問題