【问题标题】:Updating a Morph-One Associated model and receiving "Unhandled rejection Error"更新 Morph-One 关联模型并收到“未处理的拒绝错误”
【发布时间】: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


    【解决方案1】:

    我遇到了类似的问题。你说得对,save() 方法确实执行了模型的自动检索。不知道为什么它失败了。 就我而言,我通过在创建后关闭模型的自动检索来修复它。我在save()函数的参数中添加了{autoRefresh:false}。

    像这样:

    await new BusinessOwnerSpecialty(newSpecialty)
            .save(null,{autoRefresh:false})
            .then(()=>{
                /* the rest of the code */
                });
            })
    

    这样,新创建/更新模型的自动检索被关闭,我的问题得到解决。

    【讨论】:

    • 谢谢,我在一个开源 CMS 包中使用了这种方法,我将在一段时间后发布,如果您认为我们应该以其他方式解决,欢迎您提供反馈:@ 987654321@
    【解决方案2】:

    不知道为什么上述方法会导致上述错误,但目前下面的实现在没有抛出任何错误的情况下完成了这项工作:

    post.load('title').then(function(model) {
        model.related('title').save({value: input});
        return model;
    });
    

    随时编辑此解决方法并添加更多详细信息/说明;或者更好的是,回答问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2019-10-27
      相关资源
      最近更新 更多