0

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()ジェネレーター関数を作成してすべての呼び出しdatabaseyield行うと、テーブルが作成され、期待どおりにすべてが実行されます...

app.use(function *(next){
    this.db = yield services.setup();
    yield next
});

しかし、データベースを他のすべてのミドルウェアに公開したくないので、同じ元の問題に戻ります。

co-sqlite3データベースをミドルウェアに含めずにセットアップするにはどうすればよいですか?

4

1 に答える 1

1

service.setup()はジェネレーター関数であると仮定します。

よりクリーンなソリューションは次のとおりです。

app.use(function *() {
  if (!this.db) {                   // this is application context in KoaJS
    this.db = yield service.setup();
  }
  yield next;
});

app.use(function *businessLogic() {});

他の可能な方法は次のとおりです。

app.use(function *() { });
app.use(function *() { });
co(services.setup).then(function(val) {
  var service = val;
  app.listen(3000);     // use the service variable inside
});
于 2016-04-30T06:47:23.247 に答える