node-sqlite3 による各種 DB 処理は、非同期に実行されるようになっています。
例えば、以下のように SQL ステートメントを実行すると、CREATE TABLE と INSERT 処理が非同期に実行されるため、エラーが発生します。
var sqlite3 = require('sqlite3');
var db = new sqlite3.Database(':memory:');
db.run('CREATE TABLE members (name, age)');
db.run('INSERT INTO members VALUES (?)', 'maku', 10);
Error: SQLITE_ERROR: no such table: members
node-sqlite3 では、この問題に対応するため、Database#serialize() を用意しています。
Database#serialize() に渡した関数の中で Database#run() を実行すると、SQL ステートメントをキューイングした順番に同期実行してくれます。
db.serialize(function() {
db.run('CREATE TABLE members (name, age)');
db.run('INSERT INTO members VALUES (?,?)', 'maku', 10);
});