Kratos
Kratos

Reputation: 649

Breezejs [Q] Unhandled rejection reasons (should be empty)

These days,i have learned breezejs,durandaljs, so i made an spa application for excersizing,but breezejs(or q.js) often gives out errors

[Q] Unhandled rejection reasons (should be empty): ["proto.saveChanges@http:...s/jquery-1.9.1.js:2750\n"] (Firefox)

[Q] Unhandled rejection reasons (should be empty):(no stack) Error: Client side validation errors encountered - see the entityErrors collection on this object for more detail (IE10, but why deleteing an entity triggers validation ?)

I feel disappointed to use breezejs, what on earth am i doing!!!

I just do saving and deleting customer, sometimes error occured as above, sometimes works fine.(how confused i am feeling! :'(     )

Here is part of my 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;
    }
};

To save a customer:

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;

});

To delete a customer

define(function (require) { var datacontext = require('modules/dataService'); var vm = { customers: ko.observableArray(), activate: function () { var self = this; return datacontext.getCustomers(self.customers); }, deleteCustomer: deleteCustomer }; return vm; //delete customer function deleteCustomer(customer) { vm.customers.remove(customer); //Sets the entity to an EntityState of 'Deleted' customer.entityAspect.setDeleted(); datacontext.saveChanges(); } });

I think my code would work fine, but it can't!

Where is the fatal error i make? plz let me know.

Thanks in advance!

Upvotes: 1

Views: 592

Answers (1)

spilote
spilote

Reputation: 89

I know this thread has been here for more than a year now but I thought I could share my story.

I just got the same error while using breeze + angularJS. After some research, I figured it out:

I was passing null values in some of the entitie's properties while those fields in the database table where marked as NOT NULL.

Breeze - saveChanges

In the implementation of breeze.saveChanges, a check is done on a internal flag (line 12743 approx : if (this.validationOptions.validateOnSave) ...)

This is to enable verification of the entity against the database schema (aka the metadata).

Now most of the time we tend to call saveChanges without any parameters. And the error does not show otherwise then in the console as a general validation error message.

What have i done

We'll my fix was in 2 parts:

  1. Add some code in my calls to saveChanges in order to trap these errors and display a better message in the console (see code below)
  2. Fix either the DB schema (i.e. Relax NOT NULL fields to NULLABLE) OR set some default values OR enforce the business logic by adding required attributes to input controls.

Here's a snippet of the code I now use to trap the errors:

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

Upvotes: 1

Related Questions