2016-03-20 12 views
1

knexをexpressで使用すると、どのようにして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からの結果が利用可能であり、平均時間内にノードがコードを処理し続ける場合に呼び出されます。私はあなたが最初に定義されていない結果を最初にターミナルに着くことに気づかなければならないと思います。 – Molda

+1

私は 'knex'アクション/クエリを変数(あなたの場合は' response')に設定しません。 'knex'はPromiseベースなので、' then() 'コンポーネント内で変数を実行して設定します(エラーの場合は' catch() ')。 変数 'response'を使いたいのであれば、' knex'データベースクエリの前に 'var response'を設定し、その後に' then() 'の中に' response'を設定します'knex'クエリの結果からあなたが望むものは何でも。 – kuanb

答えて

2

knexはPromisesを使用します。具体的には、http://bluebirdjs.com/docs/getting-started.htmlを使用します。 console.log(bots)はすぐに呼び出されるため動作しません。.then(...)は、knexクエリが正常に呼び出されて実行された後にのみ呼び出されます。

Expressレスポンスを実行するには、編集した「同期的な回避策」が適切ですが、そのクエリをvar responseに設定する必要はありません(詳しくは、私のコメントを参照してください)。

関連する問題