Я пытаюсь выполнить пользовательскую проверку между моделями, в основном проверяю, существует ли экземпляр родительской модели (дебаты), прежде чем разрешить создание нового экземпляра дочерней модели (оператора).
Например:
const _ = require('lodash');
model.exports = function(Statement) {
Statement.validateAsync('debateId', function(err, done) {
const that = this;
const Debate = _.get(Statement, 'app.models.Debate');
Debate.exists(this.debateId, function(error, exists) {
if (error) err(error);
if (!exists) err(new Statement.ValidationError(that)); //<--line 71
done();
});
}, { 'message': 'Debate not found.' });
}
Однако при тестировании я получаю следующее, когда преднамеренно передаю неверный обсуждение. Идентификатор :
TypeError: inst.errors.add is not a function
at onerror (/home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/validations.js:658:37)
at Debate.exists (/home/wolferz/workspaces/resolution/server/models/statement.js:71:26)
at /home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/dao.js:1275:7
at /home/wolferz/workspaces/resolution/node_modules/loopback-connector/lib/sql.js:1529:7
at /home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/observer.js:250:22
at doNotify (/home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/observer.js:155:49)
at MySQL.ObserverMixin._notifyBaseObservers (/home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/observer.js:178:5)
at MySQL.ObserverMixin.notifyObserversOf (/home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/observer.js:153:8)
at cbForWork (/home/wolferz/workspaces/resolution/node_modules/loopback-datasource-juggler/lib/observer.js:240:14)
at /home/wolferz/workspaces/resolution/node_modules/loopback-connector/lib/sql.js:643:9
at handleResponse (/home/wolferz/workspaces/resolution/node_modules/loopback-connector-mysql/lib/mysql.js:193:17)
at Query.<anonymous> (/home/wolferz/workspaces/resolution/node_modules/loopback-connector-mysql/lib/mysql.js:204:7)
at Query.<anonymous> (/home/wolferz/workspaces/resolution/node_modules/mysql/lib/Connection.js:502:10)
at Query._callback (/home/wolferz/workspaces/resolution/node_modules/mysql/lib/Connection.js:468:16)
at Query.Sequence.end (/home/wolferz/workspaces/resolution/node_modules/mysql/lib/protocol/sequences/Sequence.js:83:24)
at Query._handleFinalResultPacket (/home/wolferz/workspaces/resolution/node_modules/mysql/lib/protocol/sequences/Query.js:139:8)
Это быстро приводит к сбою сервера узла.Что он должен сделать, это вернуть ошибку с сообщением «Дебаты не найдены».пользователю через API.
Я установил точку останова в указанной строке в loopback-datasource-juggler / lib / validation.js и проверил состояние приложения в этой точке,Для справки рассматриваемый код выглядит следующим образом:
if (kind !== false) inst.errors.add(attr, message, code);
kind
- ошибка проверки, которую я передал обратному вызову err()
, а inst
- экземпляр модели Statement, с которой работали (аналогично * 1023).* в моем собственном коде выше).(должно быть очевидно, что отсутствие передачи err () приводит к тому же результату, что и undefined !== false
).
Проблема заключается в том, что на данном этапе выполнения inst.errors
является логическим (логическое значение false вэтот случай).И, как я уверен, все, кто читает это, знают, что у логических выражений нет метода add()
. Ничто из этого не имеет никакого отношения к моему коду. Так что же дает?Это ошибка в Loopback?Я что-то упускаю (действительно, не удивительно, насколько неточной и непоследовательной документация Loopback)?
Node 8.15.0
Loopback 3.24.2