用书架检查它,如何捕获错误并停止数据库执行?
Checkit with bookshelf, how to catch error and stop DB execution?
我正在尝试将 checkit 与书架一起使用,在添加 checkit 规则后,故意违反它们,我的 promise#catch 块似乎没有正确捕获错误。 (我也可能完全误解了 catch 的用法)
var validationRules = new Checkit({
email: 'required',
password: 'required'
});
var User = bookshelf.Model.extend({
tableName: 'users',
initialize: function() {
this.on('saving', this.validateSave);
},
validateSave: function() {
validationRules.run(this.attributes);
}
});
User.forge({}).save().then(function(validated) {
console.log('this shouldnt trigger');
}).catch(function(err) { // this doesnt seem to be working the way I expect
console.log(e.message);
});
当我创建空的用户对象时,我得到了以下未处理的错误堆栈跟踪,并且还看到了正在构建的数据库查询(这可能是书架项目的一个单独问题,当您挂接到'saving' 事件)
Possibly unhandled Checkit Errors - email: The email is required; password: The password is required
at checkit/checkit.js:105:23
at tryCatch1 (bluebird/js/main/util.js:45:21)
at Promise._callHandler (bluebird/js/main/promise.js:597:13)
at Promise._settlePromiseFromHandler (bluebird/js/main/promise.js:607:18)
at Promise._settlePromiseAt (checkit/node_modules/bluebird/js/main/promise.js:769:18)
at Promise._settlePromises (checkit/node_modules/bluebird/js/main/promise.js:884:14)
at Async._drainQueue (checkit/node_modules/bluebird/js/main/async.js:98:12)
at Async._drainQueues (checkit/node_modules/bluebird/js/main/async.js:103:10)
at Async.drainQueues (checkit/node_modules/bluebird/js/main/async.js:37:14)
at process._tickCallback (node.js:415:13)
{ __cid: '__cid1',
method: 'insert',
options: undefined,
bindings: [],
sql: 'insert into `users` () values ()' }
ER_NO_DEFAULT_FOR_FIELD: Field 'email' doesn't have a default value
我有两个问题:
- 因为我在我的 knex 配置中打开了
debug: true
,stacktrace 和 ER_NO_DEFAULT_FOR_FIELD
之间的块似乎准备了 SQL 语句。鉴于我引入了 Checkit 来捕获模型级别的验证错误,为什么 SQL 仍在执行?
- 我是否以正确的方式使用#catch 块?如果是这样,为什么我仍然得到未处理的错误堆栈跟踪。 (看起来好像 #catch 函数产生的
e.message
实际上来自 MySQL 而不是来自 Checkit)如果不是,这里更优雅地处理错误的正确方法是什么?
到目前为止,我的主要信息来源是 bookshelf.js 文档(http://bookshelfjs.org/), and the Checkit repo (https://github.com/tgriesser/checkit)
Checkit returns promises,promises 使用 return 值 相互配合,所以在 [=11 之后没有 return
=] 您不会让 bookshelf 知道验证何时完成。
Bluebird(潜在的承诺)让您知道您可能会遭到拒绝,而您并不知道。为了更正您需要更改的代码:
validationRules.run(this.attributes);
收件人:
<b>return</b> validationRules.run(this.attributes);
在你的 validateSave
函数中,这样 promise 就可以链接了。
我正在尝试将 checkit 与书架一起使用,在添加 checkit 规则后,故意违反它们,我的 promise#catch 块似乎没有正确捕获错误。 (我也可能完全误解了 catch 的用法)
var validationRules = new Checkit({
email: 'required',
password: 'required'
});
var User = bookshelf.Model.extend({
tableName: 'users',
initialize: function() {
this.on('saving', this.validateSave);
},
validateSave: function() {
validationRules.run(this.attributes);
}
});
User.forge({}).save().then(function(validated) {
console.log('this shouldnt trigger');
}).catch(function(err) { // this doesnt seem to be working the way I expect
console.log(e.message);
});
当我创建空的用户对象时,我得到了以下未处理的错误堆栈跟踪,并且还看到了正在构建的数据库查询(这可能是书架项目的一个单独问题,当您挂接到'saving' 事件)
Possibly unhandled Checkit Errors - email: The email is required; password: The password is required
at checkit/checkit.js:105:23
at tryCatch1 (bluebird/js/main/util.js:45:21)
at Promise._callHandler (bluebird/js/main/promise.js:597:13)
at Promise._settlePromiseFromHandler (bluebird/js/main/promise.js:607:18)
at Promise._settlePromiseAt (checkit/node_modules/bluebird/js/main/promise.js:769:18)
at Promise._settlePromises (checkit/node_modules/bluebird/js/main/promise.js:884:14)
at Async._drainQueue (checkit/node_modules/bluebird/js/main/async.js:98:12)
at Async._drainQueues (checkit/node_modules/bluebird/js/main/async.js:103:10)
at Async.drainQueues (checkit/node_modules/bluebird/js/main/async.js:37:14)
at process._tickCallback (node.js:415:13)
{ __cid: '__cid1',
method: 'insert',
options: undefined,
bindings: [],
sql: 'insert into `users` () values ()' }
ER_NO_DEFAULT_FOR_FIELD: Field 'email' doesn't have a default value
我有两个问题:
- 因为我在我的 knex 配置中打开了
debug: true
,stacktrace 和ER_NO_DEFAULT_FOR_FIELD
之间的块似乎准备了 SQL 语句。鉴于我引入了 Checkit 来捕获模型级别的验证错误,为什么 SQL 仍在执行? - 我是否以正确的方式使用#catch 块?如果是这样,为什么我仍然得到未处理的错误堆栈跟踪。 (看起来好像 #catch 函数产生的
e.message
实际上来自 MySQL 而不是来自 Checkit)如果不是,这里更优雅地处理错误的正确方法是什么?
到目前为止,我的主要信息来源是 bookshelf.js 文档(http://bookshelfjs.org/), and the Checkit repo (https://github.com/tgriesser/checkit)
Checkit returns promises,promises 使用 return 值 相互配合,所以在 [=11 之后没有 return
=] 您不会让 bookshelf 知道验证何时完成。
Bluebird(潜在的承诺)让您知道您可能会遭到拒绝,而您并不知道。为了更正您需要更改的代码:
validationRules.run(this.attributes);
收件人:
<b>return</b> validationRules.run(this.attributes);
在你的 validateSave
函数中,这样 promise 就可以链接了。