【俺メモ】node-sqlite3でデータが取れなかった時の処理


node.js用のSqlite3のパッケージnode-sqlite3のdb.eachを使ったときのメモや。
インストールとか省略。

SQLの実行結果が0件の場合を検知できないパターン

app.js
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('db.sqlite3');

db.serialize(function() {
    //取り出したレコードを1行ずつループするeachを使うで
    db.each('SELECT * FROM test WHERE id = ?', [n], function(err, row) {
        if (err){
            //エラー処理してな
        }else{
            //rowの値を処理するところや
        }
    });
    //eachで結果が0件ならcallbackの処理が走らんさかい、注意な。
});

complete処理追加で解決

追加したところを抜粋すんで。

app.js
    //取り出したレコードを1行ずつループするeachを使うで
    db.each('SELECT * FROM test WHERE id = ?', [n], function(err, row) {
        if (err){
            //エラー処理してな
        }else{
            //rowの値を処理するところや
        }
    }, function(err, count){  //←complete処理追加
        //SQL実行直後に上のコールバック処理が走る前にここが処理されるで。
        if (err){
            //エラー処理な
        }else{
            if (count == 0){
                //ここでSQLの実行結果が0件の処理や
            }else{
                //処理や
            }
        }
    });
});

db.eachの外側に件数が0件の判定を書いても無駄なあがきになるさかい注意な。
なんせ非同期で処理が進んで先に外側の処理が動いてまうからな。