2013-08-03 3 views
0

У меня есть app.get в моем node.js Экспресс-сервер.Почему я получаю пустой объект, когда функция вызывается в 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.send отправляет пустой объект до того, как courtsAmount действительно уволен.

Как я могу решить эту проблему?

+0

Вы не сможете с пользой 'return' данные' rows' поскольку 'connection.query()' является асинхронным. Подробнее см. Http://stackoverflow.com/q/14220321. В примере, который он использует, Ajax с jQuery, но проблема и многие из решений могут быть применены к любой асинхронной задаче. –

ответ

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

Смежные вопросы