Breezejs [问]未处理的拒绝原因(应该是空的)

时间:2014-01-09 16:49:54

标签: breeze durandal

这些天,我学会了breezejs,durandaljs,所以我做了一个spa应用程序,但是breezejs(或q.js)经常会发出错误

  

[问]未处理的拒绝原因(应为空):[“proto.saveChanges@http:... s / jquery-1.9.1.js:2750 \ n”]( Firefox

     

[问]未处理的拒绝原因(应为空):(无堆栈)错误:遇到客户端验证错误 - 请参阅此对象上的entityErrors集合以获取更多详细信息( IE10,但为什么删除实体会触发验证吗

我对使用breezejs感到失望,我到底在做什么!!!

我只是保存并删除客户,有时会出现上述错误,有时工作正常。(我感到困惑!:'()

这是我的datacontext的一部分

  var saveChanges = function () {
    return manager.saveChanges()
        .then(saveSuccess)
        .fail(saveFailure); //.done() does not work either
    //
    function saveSuccess() {
        console.log("Save Success!");
    }
    //
    function saveFailure(error) {
        console.log("Save Failure!");
        throw error;
    }
};

保存客户:

define(['modules/dataService'], function (datacontext) {
var ctor = function () {
    this.entity = ko.observable();
};

ctor.prototype.activate = function () {
    //problem code --> [Q] Unhandled rejection reasons (should be empty)
    //it will always create empty Customer when activate is called. 
    //so error occured when i switch in because of creating empty Customer every time.
    this.entity(datacontext.createEntity('Customer'));
};

ctor.prototype.saveClick = function () {
    if (this.entity().entityAspect.validateEntity())
        datacontext.saveChanges();
    else
        console.log('validation error!');
};

return ctor;

});

删除客户

  

define(function(require){       var datacontext = require('modules / dataService');       var vm = {           客户:ko.observableArray(),           activate:function(){               var self = this;               return datacontext.getCustomers(self.customers);           },           deleteCustomer:deleteCustomer       };       返回vm;       //删除客户       function deleteCustomer(customer){           vm.customers.remove(客户);           //将实体设置为EntityState为'Deleted'           customer.entityAspect.setDeleted();           datacontext.saveChanges();       }   });

我认为我的代码可以正常工作,但它不能!

我犯的致命错误在哪里?请告诉我。

提前致谢!

1 个答案:

答案 0 :(得分:1)

我知道这个帖子已经存在了一年多,但我想我可以分享我的故事。

我在使用breeze + angularJS时遇到了同样的错误。经过一番研究,我发现了:

我在某些权限的属性中传递空值,而数据库表中的那些字段标记为NOT NULL。

Breeze - saveChanges

在breeze.saveChanges的实现中,对内部标志进行检查(约12743行:if(this.validationOptions.validateOnSave)...)

这是为了根据数据库模式(也就是元数据)验证实体。

现在大多数时候我们倾向于在没有任何参数的情况下调用saveChanges。并且错误不会在控制台中显示为一般验证错误消息。

我做了什么

我们的解决方案分为两部分:

  1. 在我对saveChanges的调用中添加一些代码,以便捕获这些错误并在控制台中显示更好的消息(参见下面的代码)
  2. 修复数据库架构(即,将NOT NOT NULL字段设置为NULLABLE)或设置一些默认值,或者通过向输入控件添加必需的属性来强制执行业务逻辑。
  3. 以下是我现在用来捕获错误的代码片段:

    return manager.saveChanges(null, null, null, function (errors) {
        console.log('breeze saveChanges returned some errors: ');
    
        errors.entityErrors.forEach(function(e) {
            console.log(e.errorMessage, e);
        });
    }); // return promise