2016-08-30 11 views
1

これはNodejsの私の最初の個人的なプロジェクトです。私はすぐにライブに入るつもりです。 私はsqlite3を使用するNodejsサーバーを持っています。すでに読み込まれているテーブルの列には、word、transform、および事前に計算された値を持つ3000行しかありません。nodejs promiseまたはwaitを使用してsqlite3クエリ結果を取得する

DB内の単語を調べて、それが有効であることを確認する必要があります。

var sqlite3 = require("sqlite3").verbose(); 
var db = new sqlite3.Database("validate.db"); 
db.get("SELECT * FROM tab WHERE w = ?", word, function(err, row) { 
    if(err) { console.log("Lookup:",word,", Error => ",err); return false; } 
    return true; 
}); 

問題は、このコードの呼び出し側には多くのコンテキストがあり、処理を待つ必要があることです。だから、私はこれを試しました

function dbLookup(db, w) { 
    return function(cb) { 
    var rows = []; 
    db.exec('SELECT w FROM tab WHERE w = "'+w+'"') 
     .on('row', function(r) { 
     rows.push(r)   
     }) 
     .on('result', function() { 
     cb(rows); 
     }); 
} 

async.each([word], function(w) { 
     dbLookup(this.db, w); 
    }, function(err) { 
     if(err) {console.log("...ERROR..."); return false; } 
     else {console.log("...SUCCESS..."); return true; } 
}); 

これは、コールバックが自分のペースで発砲することができますので、これは問題を解決しません。

私はsolve my problem 青い鳥缶のようなものを使用して、その約束を読ん今私は、クエリの値/結果を得ることができないんだけど:

私は長い間私の髪を引っ張ってきました。私は非同期作業をするか、または約束のアプローチから結果を得るのを助けてください。

答えて

0
var async = require('async'); 
var sqlite3 = require("sqlite3").verbose(); 
var db = new sqlite3.Database("validate.db"); 

function check(word, callback) { 
    db.get("SELECT count(1) cnt FROM tab WHERE w = ?", word, callback) 
} 

async.map(words, check, function(err, results) { 
    if (err) 
     return console.log('Query error') 

    var all_checked = results.filter(function(r) { 
     return r.cnt > 0 
    }); 
    ... 
}); 

それとも

var sqlite3 = require("sqlite3").verbose(); 
var db = new sqlite3.Database("validate.db"); 

db.all("SELECT distinct w FROM tab", function(err, rows) { 
    var all_checked = words.filter(function (w) { 
     return rows.indexOf(w) != -1; 
    }) 
    ... 
}) 
+0

感謝。私はあなたの最初のアプローチを試みた。私は 'async.mapの直前に' var all_checked = false; 'を追加しました。' word'は単一の文字列で、 'var all_checked = results.filter'から' var'を削除しました。 'console.log(" Result: "、all_checked);' 'async.map(...});' 'の後に' [] 'を表示するので、結果は出ません。私は同じ問題に戻っているように見えます。代わりに、私は '.get()'を使用してクエリ結果を得ることができますか? –

+0

ノードは非同期であるため、データは '...'になります。 - http://bluebirdjs.com/docs/api/promise.all.html –

関連する問題