2015-02-20 2 views
1

Я новичок в обещаниях и Q, и я пытаюсь преобразовать маршрут, который использует query в node-mysql. Вот выдержки из моего кода:Почему мое обещание Q не работает?

var Q = require('q'); 
// connection defined elsewhere 

router.get('/', function(req, res) { 
    var query = Q.denodeify(connection.query); 
    var promise = query("-- query ommitted --", [req.user.id]); 
    promise.then(console.log, console.error); 
}); 

Я пытаюсь преобразовать это из существующей настройки, который не использует обещания, так что я знаю, что соединение установлено правильно и запрос является действительным. Всякий раз, когда я пытаюсь запросить этот маршрут, я получаю то же сообщение в STDERR:

[TypeError: Cannot read property 'connectionConfig' of undefined] 

Я не знаю, где он идет от так что я не знаю, как найти полную трассировку стека. Я также попробовал альтернативную версию этого кода, где у меня была моя собственная функция вместо console.log и console.error, но эта функция никогда не вызывалась и возникала такая же ошибка.

ответ

4

Обновленный ответ:

Вы, вероятно, потерять лексическую область для connection когда вы denodeify метод запроса.

Глядя на Q documentation он говорит, что это может быть проблема:

Если вы работаете с методами, вместо простых функций, вы можете легко работать и обычные задачи, где проходят метод другой функции -подобный Q.nfcall- «un-binds» метод от его владельца.

Чтобы исправить это попробуйте использовать Q.nbind вместо:

var query = Q.nbind(connection.query, connection); 
var promise = query("-- query ommitted --", [req.user.id]); 
promise.then(console.log, console.error); 

Оригинальный ответ:

Глядя на источник в узле-MySQL, единственное место, где connectionConfig доступен в Pool.js. Поэтому я предполагаю, что у вас возникла проблема с настройкой пула.

+0

Как я уже сказал, я конвертирую этот код из существующего не обещанного кода. Этот код использовал пул просто отлично. Кроме того, у меня есть другие маршруты, которые по-прежнему используют старый код, который использует один и тот же пул без проблем. – Greg

+0

@Greg См. Мой обновленный ответ на использование 'Q.nbind'. –

+0

Это помогло мне решить мою проблему, используя Promise. 'var query = Promise.denodeify (connection.query.bind (connection))' - та же идея привязать объект соединения к функции. – Federico

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