我正在尝试在我的 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
不将其包含在中间件中的情况下设置数据库?