【发布时间】:2020-08-02 08:48:17
【问题描述】:
代码
首选方式
this.related('title').save({value: input});
但是由于这条线是从某个抽象类的中间剪切和粘贴的,下面是一种更解耦的方式,可以直接重现相同的错误消息。
替代实现
let title = await book.related('title');
title.set({value: inputs.title});
title.save().then( (model) => {} );
错误信息
Unhandled rejection Error: Undefined binding(s) detected when compiling SELECT. Undefined column(s): [titles.titleable_id] query: select distinct `titles`.* from `titles` where `titles`.`id` = ? and `titles`.`titleable_id` = ? and `titles`.`titleable_type` = ? limit ?
at QueryCompiler_MySQL.toSQL (/Users/captainhusaynpinguin/Documents/sails/ilog/node_modules/knex/lib/query/compiler.js:101:13)
at Builder.toSQL (/Users/captainhusaynpinguin/Documents/sails/ilog/node_modules/knex/lib/query/builder.js:77:44)
at /Users/captainhusaynpinguin/Documents/sails/ilog/node_modules/knex/lib/runner.js:31:36
at /Users/captainhusaynpinguin/Documents/sails/ilog/node_modules/knex/lib/runner.js:260:24
注意:虽然在终端打印了上述错误,但由于 JavaScript 执行嵌套函数的方式,程序实际上会更新数据库中的行并继续渲染响应视图。但是,当相同的功能与await 结合使用时,此错误可能会导致程序在中间中断(显示 500 视图)...
背景
Bookshelf.js 通过自定义挂钩与 Sails-JS 挂钩:
型号:标题
let Post = require('../Post')
var Title = sails.hooks.orm.bookshelf.Model.extend({
tableName: 'titles',
hasTimestamps: true,
titleable() {
return this.morphTo('titleable', 'Post')
}
});
module.exports = sails.hooks.orm.bookshelf.model('Title', Title);
模型:发布
let Post = sails.hooks.orm.bookshelf.Model.extend(
tableName: 'posts',
title() {
return this.morphOne('Title', 'titleable', ['titleable_type', 'titleable_id'])
}
);
module.exports = Post;
- MacOS 塞拉利昂
- mysql Ver 8.0.18 for osx10.12 on x86_64 (Homebrew)
- 节点 v12.13.1
- 帆 v1.2.4
- 书架@1.1.1
- knex@0.21.0
似乎解决类似问题/错误的其他未回答问题
Error: Undefined binding(s) detected when compiling SELECT from Bookshelf.js save()
可能的解释
正如 api 文档所指出的,save() 方法会自动检索模型,此时我认为 Bookshelf 无法传递初始详细信息(titleable_type 和 titleable_id)转到knex。
PS。我是刚开始用JS做后端,如果是初学者的一些错误/对基本概念的误解,请提前道歉。
【问题讨论】:
标签: knex.js bookshelf.js