这是我在Nodejs的第一个个人项目。我想尽快上班。 我有一个使用sqlite3的Nodejs服务器。在表的一列中,每行只有3000行,包含单词,变换和预先计算的值,这些行已经填充。
我需要在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; }
});
这并不能解决等待问题,因为回调可以按照自己的节奏触发。
我使用像bluebird这样的东西可以solve my problem读到这个承诺 但现在我无法获得查询的值/结果:
我一直在拉头发。请帮助我让异步工作或从promise方法中获得结果。
答案 0 :(得分: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;
})
...
})