Breezejs Как отладить причину TypeError в ответе на запрос

Я пытаюсь использовать Breeze для запроса конечной точки веб-API ASP.Net, и запрос завершается ошибкой - с объектом данных, содержащим:

internalError: TypeError
arguments: Array[2]
0: "createCtor"
1: null
length: 2
__proto__: Array[0]
get message: function () { [native code] }
get stack: function () { [native code] }
set message: function () { [native code] }
set stack: function () { [native code] }
type: "non_object_property_load"

Объект данных имеет свойство сообщения (и ответа), которое содержит полный ответ json на запрос, который выглядит нормально, и сгенерированные метаданные соответствуют ответу - он также записывает статус 200 для ответа.

Итак, я предполагаю, что есть какая-то проблема с отображением ответа на объект на стороне клиента?

Я использую пакет NuGet для версии Breeze 0.85.2.

Я могу заставить образец проекта ToDo нормально работать в той же среде.

В моем проекте используются объекты домена, контексты и т. д. из разных сборок и пространств имен, но я так понял, что это поддерживается в этой версии?

Кроме того, одно из свойств является перечислением - в метаданных оно определяется как {\"name\":\"State\",\"type\":\"Edm.Self.State\",\"nullable\":\"false\"}], но в ответе оно передается как целое число.

Ищу советы о том, как отлаживать это дальше на стороне клиента

Обновить

сравнивая рабочий образец с моим кодом, похоже, что ошибка исходит от этой функции:

/**
Returns the constructor for this EntityType.
@method getEntityCtor
@return {Function} The constructor for this EntityType.
**/
ctor.prototype.getEntityCtor = function () {
    if (this._ctor) return this._ctor;
    var typeRegistry = this.metadataStore._typeRegistry;
    var aCtor = typeRegistry[this.name] || typeRegistry[this.shortName];
    if (!aCtor) {
        var createCtor = v_modelLibraryDef.defaultInstance.createCtor;
        if (createCtor) {
            aCtor = createCtor(this);
        } else {
            aCtor = function() {
            };
        }
    }
    this._setCtor(aCtor);
    return aCtor;
};

Свойство defaultInstance в v_modelLibraryDef не определено в моем рабочем коде — что мне не хватает в конфигурации бриза, чтобы это произошло?

Обновление 2 — решено, но почему

Итак, у меня это заработало - мне не хватало ссылки на нокаут (которую я планировал использовать, но не зашел так далеко) - я был немного введен в заблуждение предварительными условиями бриза, которые не упоминают нокаут, поэтому, если кто-то может объясните, как я мог заставить это работать без нокаута, и если это ошибка, то баллы ваши


person Richard    schedule 23.01.2013    source источник


Ответы (4)


Извини, что ты боролся с Ричардом. Мы постараемся извлечь из этого урок и избавить следующего человека от той боли, которую вы пережили.

Между прочим, мы не говорим, что нокаут является обязательным условием... потому что нокаут не является обязательным условием. Вместо этого вы можете использовать Angular или Backbone, и в будущем мы ожидаем другие альтернативы.

Мы не хотим утопить вас в параметрах конфигурации, когда вы только изучаете Breeze. Поэтому мы выбрали KO в качестве библиотеки модели по умолчанию (точно так же, как jQuery является поставщиком AJAX по умолчанию, а Web API — технологией «службы данных» по умолчанию). Мы говорим так во многих местах; предварительные условия выглядят как еще одно хорошее место, чтобы упомянуть об этом.

Как оказалось, вы все равно собирались использовать KO, поэтому никакой настройки не потребовалось бы. Большинство людей начинают с чего-то вроде шаблона MVC, который включает KO и загружает его для вас в Index.cshtml.

Очевидно, вы начали с чистого листа (возможно, «пустое веб-приложение ASP»?). Пакет NuGet веб-API Breeze стремится быть свободным и поэтому не включает KO. Мы решили (ошибочно), что вы добавите его сами... в правильном порядке скриптов... если захотите использовать KO. Ясно, что мы могли бы лучше документировать этот конкретный путь разработки... тем более, что нам самим он так нравится. Спасибо, что указали на это.

Другая проблема заключается в том, что исключение не помогло. Вы можете видеть из других попыток ответить на ваш вопрос, что даже люди с опытом Breeze не могли понять, что не так. Мы посмотрим, сможем ли мы обнаружить отсутствующий скрипт чуть раньше и выдать исключение с более подходящим сообщением.

person Ward    schedule 23.01.2013
comment
да, я использовал шаблон пустого веб-приложения и добавлял библиотеки по мере того, как и когда начал их использовать - теперь я действительно впечатлен Breeze! - person Richard; 29.01.2013

Получил ту же ошибку, и ссылка на Knockout.js помогла (я использую angularjs для своего приложения)

  manager.executeQuery(query).then(function(data) {
        console.log(data);
    });

Но. Похоже, data-mapper по умолчанию работает с нокаутом, так что у нас есть результаты XHR как K.O. модель с наблюдаемыми.

поэтому я добавил breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);

и теперь я не получаю data.results как наблюдаемую коллекцию.

Надеюсь, мой ответ поможет.

person Andrew    schedule 02.02.2013

Эта ошибка выглядит так, как будто она связана с одним из ваших конструкторов типа Entity. Я предполагаю, что вы вызываете метод «registerEntityTypeCtor» где-то в своем коде. Если да, то я бы поставил точку останова в конструкторе, который вы там регистрируете.

Согласно вашему другому комментарию, перечисления .NET должны преобразовываться в целые числа на клиенте бриза. Это единственный «примитивный» тип данных, который может их поддерживать. Они будут преобразованы обратно в перечисления на сервере, когда вы вызовете EntityManager.saveChanges.

Breeze не требует «knockout», вы также можете использовать «angularjs» или «backbone». Мы просто по умолчанию устанавливаем клиент Breeze на Knockout, если вы не укажете другую библиотеку. См. тему breeze.config.initializeAdapterInstance здесь . Нам нужно лучше документировать это.

person Jay Traband    schedule 23.01.2013

Каждый раз, когда я получаю ошибку, при которой свойство Message ответа является данными в формате json, это означает, что у меня есть ошибка в функции, которая запускается после получения данных.

Пример:

dataservice.getPalanca(routeData.PalancaID)
.then(function (data) {
    self.palanca(data.results[0]);
})
.fail(function (error) {
    console.log(error); /*if I get here and error.Message == correct json almost always means error in .then function*/
    toastr.error("Ha ocurrido un error al obtener los datos");
});

Надеюсь, я помогу вам.

person Julián Yuste    schedule 23.01.2013
comment
спасибо, Джулиан, но я урезал свою функцию then до простого оповещения и вернул true - оповещение - это первая строка, и она никогда не вызывалась - person Richard; 23.01.2013