【问题标题】:Can't save Bookshelf model instance无法保存 Bookshelf 模型实例
【发布时间】:2013-09-19 13:50:58
【问题描述】:

我正在试验 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 吗?并且(是的,我知道这是题外话)是否有任何简单 示例或教程可供学习?

【问题讨论】:

    标签: node.js bookshelf.js knex.js


    【解决方案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');
    

    至于示例,我希望尽快将它们放在一起...否则,查看集成测试中的代码将是您最好的选择。

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多