我无法重现您的确切错误消息,但您的代码可能与某处的大小写不匹配。
这是一个使用 SQLite3 的工作示例(节点 4.2.2,书架 0.9.1,knex 0.9.0 和 sqlite3 3.1.1):
与sqlite3 data.sqlite3:
create table languages (languageid int primary key, name text);
create table posts(postid int primary key, languageid int, text text);
insert into languages values (1, 'english');
insert into languages values (2, 'german');
insert into posts values(1, 2, 'etwas geschrieben');
insert into posts values(2, 1, 'something written');
insert into posts values(3, 1, 'something else written');
在节点上:
var knex = require('knex')({client:'sqlite3',connection:{filename: 'data.sqlite3'}});
var bookshelf = require('bookshelf')(knex);
var Language = bookshelf.Model.extend({tableName: 'languages', idAttribute: 'languageid'});
var Post = bookshelf.Model.extend({tableName: 'posts', idAttribute: 'postid', Language: function(){return this.belongsTo(Language,'languageid');}});
Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.toJSON());});
// Outputs:
// { postid: 3,
// languageid: 1,
// text: 'something else written',
// Language: { languageid: 1, name: 'english' } }
Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.related('Language').toJSON());});
// Outputs:
// { languageid: 1, name: 'english' }
如果我在 belongsTo() 上使用错误大小写的 languages 定义 Post:
var Post = bookshelf.Model.extend({tableName: 'posts', idAttribute: 'postid', Language: function(){return this.belongsTo(language,'languageid');}});
// note there was no error yet
Post.where({postid: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.related('Language').toJSON());});
// Fails with: Unhandled rejection ReferenceError: language is not defined
另外,如果你定义的关系键的大小写与定义目标时使用的不同,它会默默地不匹配:
// note using `LanguageID` instead of `languageid`
var Post = bookshelf.Model.extend({tableName: 'posts', idAttribute: 'PostID', Language: function(){return this.belongsTo(Language,'LanguageID');}});
Post.where({PostID: 3}).fetch({withRelated:['Language']}).then(function(p) {console.log(p.related('Language').toJSON());});
// Outputs and empty list (no matches!):
// {}
因此,我建议您查看用于键的大小写和放置在关系子句中的对象名称。