koa アプリケーション内にデータベース アクセス レイヤーを実装しようとしています。これはうまくいきます:
var sqlite3 = require('co-sqlite3');
var services = require('./services/services');
app.use(function *(next){
this.db = yield sqlite3(services.file);
yield next
});
しかし、アプリ内のすべてのミドルウェアにデータベースを公開したくありません。これを防ぐために、次のように定義されて.setup()
いるミドルウェアの外で実行してみました。services.setup();
var models = require('../models/models');
var path = require('path');
var sqlite3 = require('co-sqlite3');
module.exports = {
file: path.join(__dirname, '../data/db.db'),
setup: function () {
var database = yield sqlite3(this.file);
console.log('Database connected...');
database.run("PRAGMA foreign_keys = ON;");
database.run("DROP TABLE IF EXISTS BLOG_POST_BODIES; DROP TABLE IF EXISTS BLOG_POSTS;");
database.run(models.blog_posts);
database.run(models.users);
console.log('database created...');
database.run("INSERT INTO BLOG_POST_BODIES(BODY) VALUES('HELLO WORLD');");
var x = database.run("SELECT * FROM BLOG_POST_BODIES");
console.log(x);
}
};
models
オブジェクトには、ブログ投稿とユーザー テーブルを作成するために実行するスクリプトが含まれているだけです。
問題を引き起こしている行はvar database = yield sqlite3(this.file);
、次のエラーが表示されることです。
var database = yield sqlite3(this.file);
^^^^^^^
SyntaxError: Unexpected identifier
yield
転送するものが何もないので、これは正しいと思います。しかしsetup()
、ジェネレーター関数を作成しても実行されません。同様に、yield
ステートメントを削除すると、 database.run is not a function
.
私はこれにこだわっています。適切に実装する方法がわかりません。
編集:
.setup()
ジェネレーター関数を作成してすべての呼び出しdatabase
をyield
行うと、テーブルが作成され、期待どおりにすべてが実行されます...
app.use(function *(next){
this.db = yield services.setup();
yield next
});
しかし、データベースを他のすべてのミドルウェアに公開したくないので、同じ元の問題に戻ります。
co-sqlite3
データベースをミドルウェアに含めずにセットアップするにはどうすればよいですか?