2016-07-24 9 views
0

ノードsqlite3のDBをいつ閉じるか、あるいは本当に一般的なパッケージの使い方を知ることはできません。もし私がこれを実行すると、私は "そのようなテーブル:部屋"を得るようです。最終的には十分な時間を実行した後、私はテーブルを作ることができるかもしれません。ノードsqlite3を閉じるとき

var sqlite3 = require('sqlite3').verbose(); 

class RoomManager{ 
    constructor(options){ 

     this.db = this._createDb(); 
     this.table = "rooms"; 

     this._createTable(); 
     this.addRoom({ 
      name : 'test3' 
     }).getRooms() 
     this.deleteRoom({ 
      name : 'test3' 
     }).getRooms(); 

     return this; 
    } 

    _createDb() { 
     return new sqlite3.Database('chat'); 
    } 

    _createTable(){ 
     this.db.run("CREATE TABLE IF NOT EXISTS " + this.table + " (name TEXT, size INT)"); 
     return this; 
    } 

    addRoom(options){ 
     this.db.run("INSERT INTO " + this.table + " (name, size) VALUES ($name, $size)", { 
      $name : options.name, 
      $size : options.size || 1000 
     }); 
     return this; 
    } 

    getRooms(){ 
     this.db.all("SELECT rowid, name, size FROM " + this.table, function(err, rows) { 
      rows.forEach(function (row) { 
       console.log(row.rowid + ": " + row.name + " - " + row.size); 
      }); 
     }); 
     return this; 
    } 

    getRoom(options){ 
     if(options.name){ 
      this.db.get("SELECT * FROM " + this.table + " WHERE name = $name", { 
       $name : options.name 
      }, function(err, row){ 
       return row; 
      }); 
     } 
    } 

    deleteRoom(options){ 
     this.db.run("DELETE FROM " + this.table + " WHERE name = $name", { 
      $name : options.name 
     }); 
     return this; 
    } 
} 

module.exports = RoomManager; 
+0

* what *を実行すると、この 'RoomManager'クラスを実際に使用するコードは表示されていません。 – mscdex

+0

は単に 'new RoomManager()'です。テストとして、コンストラクタはテーブルを作成し、行を追加し、行を取得し、行を削除し、再度取得します – Tester232323

答えて

1

ノードが非同期であるという問題。したがって、コールバック関数でコマンドの終わりを待たなければなりません。例えば

this.db.run(query, params, function(err) { 
    if (err) 
     return console.log(err); 

    // do next query here 
}) 

フローを制御できるのはdb.serializeです。一般的には役に立たない。より良い非同期モジュールを使用するか、それを約束します。

+0

ありがとう、これは理にかなっています。しかし、それは役に立たないのはどういう意味ですか?どのような非同期モジュールですか? – Tester232323

+0

クエリのシーケンスが必要な場合、 'sqlite.serialize'は不快です。新しいレコードを挿入し、そのIDを取得し、このIDでsmthを行います。 Async(https://github.com/caolan/async)は、非同期コマンドのリストを実行するための一般的なモジュールの1つです。 –

関連する問題