Обновление ассоциированной модели Morph-One и получение сообщения «Ошибка необработанного отклонения» - PullRequest
0 голосов
/ 20 апреля 2020

Код

Предпочтительный способ

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 выполняя вложенные функции, программа фактически обновляет строку в базе данных и продолжает отображение представления ответа. Однако эта ошибка может привести к разрыву программы в середине (отображение 500), когда та же функциональность сочетается с await ...

Фон

Книжная полка. js is подключен к 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 Sierra
  • mysql Ver 8.0.18 для osx10.12 на x86_64 (Homebrew)
  • узел v12.13.1
  • Sails v1.2.4
  • bookshelf@1.1.1
  • knex@0.21.0

Другие оставшиеся без ответа вопросы, связанные с аналогичной проблемой / ошибкой

Ошибка: при компиляции SELECT с Книжной полки обнаружены неопределенные привязки. 1065 * save ()

Возможное объяснение

Как отмечается в документации API, метод save() выполняет автоматическое c извлечение модели, к которому я думаю Книжная полка не может передать начальные данные (titleable_type и titleable_id) в knex .

PS. Я только начинаю использовать JS для бэкэнда, поэтому заранее прошу прощения, если ошибка вызвана ошибками / недопониманием основами c базовых концепций.

1 Ответ

0 голосов
/ 20 апреля 2020

Понятия не имею, почему приведенный выше путь приводит к такой ошибке, но в настоящее время выполнение не выполняет работу, не вызывая ошибок:

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

Не стесняйтесь редактировать этот ответ и добавлять больше подробнее / объяснение.

...