2016-03-20 2 views
1

Использование knex с выражением, как я могу получить доступ к результатам запроса knex?Как получить доступ к результатам запроса knex

Пример:

var bots = [] 

response = knex.select('id', 'name').from('robots') 
    .then(function(robots){ 
    console.log(robots); 
    bots = robots 
    }); 

console.log(bots) 

Это будет регистрировать роботов, но не не обновлять bots массив, который является пустым.

EDIT:

В синхронном обходного пути в экспресс-маршрут, я застрял экспресс блок внутри блока knex:

router.get('/robots', function (req, res) { 

    response = knex.select('id', 'name').from('robots').then(function(bots){ 

    res.render('robots/index', { 
     page_title: 'All Robots', 
     robots: bots 
    }); // res.render 

    }); // knex.select 

}); // router.get 

Является ли это рекомендуемая модель?

+4

Функция обратного вызова функции 'then' является асинхронной, в основном она вызывается, когда доступны результаты из db, и узел продолжает обрабатывать ваш код, если есть какое-либо среднее время. Я думаю, вы, должно быть, заметили, что вы получили в терминале первые неопределенные результаты. Просто найдите несколько уроков об async nodejs – Molda

+1

Я бы не задал действие/запрос 'knex' переменной (в вашем случае' response'). Поскольку «knex» основан на Promise, выполняйте и устанавливайте переменные в компоненте 'then()' (или 'catch()' для ошибок). Итак, если вы хотите иметь переменную 'response', я бы установил' var response' перед запросом базы данных 'knex', а затем, затем и внутри' then() ', я бы установил' response' для независимо от того, что вы хотите от результата запроса «knex». – kuanb

ответ

2

knex использует обещания. В частности, он использует http://bluebirdjs.com/docs/getting-started.html. console.log(bots) не будет работать, потому что он вызывается сразу, а .then(...) вызывается только после того, как запрос knex был успешно вызван и запущен.

Ваш отредактированный «синхронный обходной путь» является правильным методом для запуска ответа Express, хотя вам не нужно устанавливать этот запрос на var response (см. Мой комментарий к вашему вопросу, чтобы узнать больше об этом).

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