0

我正在试验 Bookshelf,并制作了一个小程序来了解它是如何工作的。

不幸的是,它似乎并没有真正起作用,因为 Knex 抱怨它尚未初始化。

我使用的是 Bookshelf 0.3.1 版和 Knex 0.2.6 版。

当我运行我的简单测试程序时,我收到以下错误:

/home/joachimp/tmp/ks/db/node_modules/knex/knex.js:20
      throw new Error('Knex 实例尚未初始化。');
            ^
错误:Knex 实例尚未初始化。
    在 Knex (/home/joachimp/tmp/ks/db/node_modules/knex/knex.js:20:13)
    在 _.extend.builder (/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:384:14)
    在查询(/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:1294:35)
    在 _.extend.query (/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:379:14)
    在新 Bookshelf.Sync (/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:823:26)
    在 _.extend.sync (/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:389:14)
    在 _.extend.save (/home/joachimp/tmp/ks/db/node_modules/bookshelf/bookshelf.js:263:24)
    在对象。(/home/joachimp/tmp/ks/db/dbtest.js:20:6)
    在 Module._compile (module.js:456:26)
    在 Object.Module._extensions..js (module.js:474:10)

程序就是这样的:

var Bookshelf = require('bookshelf');

Bookshelf.Initialize('sqlite3', {
    client: 'sqlite3',
    connection: {
        filename : './dbtest.sqlite3'
    }
});

var TestModel = Bookshelf.Model.extend({
    tableName: 'TestModel',

    initialize: function() {
    },

    name: 'foo'
});

var test = new TestModel;
test.save();    // <- Line 20

console.log('All done');

文档很少,示例更是如此,或者我可能已经弄清楚了。

我也尝试过创建集合并将模型实例放入其中,并将同步对象与该insert方法一起使用。所有与未初始化 Knex 的结果相同。

我错过了什么?我必须单独初始化 Knex 吗?而且(是的,我知道这是题外话)是否有任何简单的示例或教程可供学习?

4

1 回答 1

1

所以这是一个糟糕的设计决定,“Knex”中有一个 try/catch 块包装了客户端初始化代码,所以除了使用错误的名称之外,还有一个与客户端无关的错误,它会被静音。

我猜你使用的 sqlite3 客户端有问题,这已在最新版本中修复。使用以下代码尝试最新的 Bookshelf 0.5.1 和 Knex 0.4.3:

var Bookshelf = require('bookshelf');

var bookshelf = Bookshelf.initialize({
    client: 'sqlite3',
    connection: {
        filename : './dbtest.sqlite3'
    }
});

var TestModel = bookshelf.Model.extend({
    tableName: 'TestModel',

    initialize: function() {
    },

    name: 'foo'
});

var test = new TestModel;
test.save();    // <- Line 20

console.log('All done');

至于例子,我希望很快能找到一个……否则,查看集成测试中的代码将是你最好的选择。

于 2013-09-22T04:37:45.623 回答