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()一个生成器函数并进行所有database调用yield,那么它会创建表并按预期执行所有内容......

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 回答