Подтвердить что ты не робот

Ошибка бриза: Незаконное строительство - используйте "или", чтобы комбинировать проверки

Я встретил эту ошибку Breeze

[Незаконное строительство - использование или совмещение чеков)

в Chrome при загрузке страницы редактирования объекта. Когда я обновляю страницу, сообщение об ошибке больше не появляется. Эта ошибка происходит случайно, нерегулярно на моем сайте. Я не мог воспроизвести его с использованием определенного сценария, просто встретив его случайным образом.

Я вижу это сообщение об ошибке внутри кода Бриза

if (curContext.prevContext === null) {
    curContext.prevContext = context;
    // just update the prevContext but don't change the curContext.
    return that;
} else if (context.prevContext === null) {
    context.prevContext = that._context;
} else {
    throw new Error("Illegal construction - use 'or' to combine checks");
}

Не могли бы вы рассказать мне: на основе вышеуказанного блока кода, в каких случаях эта ошибка возникает?

Большое спасибо.

4b9b3361

Ответ 1

Мы немного тупицы, потому что никто не может определить, когда это произойдет.

Вы все сделаете нам одолжение и измените свой breeze.debug.js, чтобы получить больше информации о состоянии дел при его броске?

Возможно, вы можете добавить это:

} else {
     console.log("** Aaargh! 'curContext.prevContext': " + curContext.prevContext +
                " 'context.prevContext': " + context.prevContext);
     throw new Error("Illegal construction - use 'or' to combine checks");
}

Схватывание на соломинках. Вся информация помогает.

Обновление 26 февраля 2014 г.

AHA! Спасибо @steve, @matthias и другие!

Как я лично подозревал, что-то, где-то, решил установить prevContext на undeclared вместо null. Я собирался рекомендовать, чтобы мы все равно переключились на "=="..., которые будут обрабатывать оба случая. Фальшивость достаточно хороша для ИМО. Мы вернемся к вам, когда мы это сделаем (предполагая, что никто из объектов команды Бриз не применяет исправление, которое мы не можем проверить).

Обновление 27 февраля 2014 г.

Я запускаю тесты DocCode с помощью breeze.min.js в Chrome v33, и все они проходят. Разочарование. Джей проведет тесты с помощью breeze.min.js в Chrome v33 тоже... и мы увидим, если кто-то из них потерпит неудачу. Я не надеюсь.

Я получаю ожидаемое поведение для разумных (в том числе и незаконных) вариаций parm (undefined, null, true, false, a string) в строке из getEntityType, что @Маттиас упомянул

assertParam(parm, "okIfNotFound").isBoolean().isOptional().check(false);

Мой статический анализ кода (которому доверяет?) говорит мне, что первый оператор сравнения должен оставаться ===, тогда как оператор сравнения во втором предложении может быть либо ==, либо ===. Автор кода много работал, чтобы убедиться, что левый операнд никогда не был undefined на практике; мой статический анализ показывает, что он может стать undefined... хотя я не могу устроить мир так, чтобы это произошло. Может быть, неудача воображения.

Мой статический анализ мини-кода говорит, что он корректен, хотя версия my отличается от вашей, возможно, потому, что моя минимизирована против меняющейся копии breeze.debug.js(где-то ближе к тому, что v.1.4.9 будет).

// Reformatted w/ spaces and new lines for readability. 
// Observe that the minifier reversed the direction of the second null test!
// That is smart and does no harm
// I can assure you the pre-minified code is the same as what you folks are reporting.
function m(a,b) {
    if(a._context){
          for(var c=a._context; null!=c.prevContext;) c=c.prevContext;
          if(null === c.prevContext) return c.prevContext=b, a;
          if(null !== b.prevContext)
               throw new Error("Illegal construction - use 'or' to combine checks");
          b.prevContext=a._context
    }
    return n(a,b)
}

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

if (curContext.prevContext === null) {
    curContext.prevContext = context;
    // just update the prevContext but don't change the curContext.
    return that;
} else if (context.prevContext == null) {  // CHANGED TO "if null or undefined"
    context.prevContext = that._context;
} else {
    throw new Error("Illegal construction - use 'or' to combine checks");
}

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

Мы отправляем v.1.4.9 завтра (28 февраля), поэтому попробуйте этот pronto!

Ответ 2

У моей команды тоже была эта проблема. Это началось около месяца назад, но действительно увеличилось в частоте за последние 1-2 недели. Возможно, недавний хром-релиз виноват.

Вот что я знаю, все комментарии относительно ветров 1.4.1:

- Поведение прерывисто и, по-видимому, происходит случайным образом. Для меня это указывает на проблему с синхронизацией.

- Основной браузер, генерирующий эту ошибку, - хром. Мы также поддерживаем firefox и IE и не имеем конкретных доказательств того, что любой браузер, но хром, бросает эту ошибку. Возможно, недавний выпуск хром имеет другой профиль производительности, который усугубляет ранее существовавшую проблему (опять же, время?)

- Для нас, устранение связывания и минимизации, похоже, устраняет проблему. Я не думаю, что есть проблема с нашим мини-кодом (Microsoft Web Optimization), поскольку все работает независимо от других браузеров. Это для меня снова указывает на проблему с синхронизацией.

-Наконец, я просто смог воспроизвести его в моей среде разработчиков, открыв инструменты для разработчиков Chrome. Используя стек q обещаний и мучительно перемещаясь по минитипированному коду, я смог сузить его до следующего: В начале моего приложения я вызываю fetchMetadata. В обработчике успеха fetchMetadata я делаю вызов metadataStore.getEntityType('some_entity'), и именно в этом методе breeze эта ошибка генерируется в моем сценарии. Что-то с хранилищем метаданных не будет последовательно инициализировано или настроено на этом раннем этапе жизненного цикла приложения страниц.

РЕДАКТИРОВАТЬ: Из комментариев это выглядит как ошибка chrome 33, где null! == null в случайное время. По неизвестным причинам минимизация файла breeze.debug.js, по-видимому, связана (большинство/все сообщения о проблеме происходят на уменьшенной версии бриза). Для меня, изменяя следующий код в breeze.debug.js:

} else if (context.prevContext === null) {
    context.prevContext = that._context;
} else {
    throw new Error("Illegal construction - use 'or' to combine checks");
}

в

} else if (context.prevContext == null) {
    context.prevContext = that._context;
} else {
    throw new Error("Illegal construction - use 'or' to combine checks");
}

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

Еще одна вещь, которую я заметил, состоит в том, что мини-версия функции имеет аргумент с тем же именем функции (t). Это все еще не объясняет результаты теста "Aaarg".

   function t(n, t) {
        if (n._context) {
            for (var i = n._context; i.prevContext != null; )
                i = i.prevContext;
            if (i.prevContext === null)
                return i.prevContext = t, n;
            if (t.prevContext == null)
                t.prevContext = n._context;
            else
                throw new Error("Illegal construction - use 'or' to combine checks");
        }
        return b(n, t)
    }

Ответ 3

Это началось, когда Chrome обновился до версии 33. Это не произошло в Chrome 32. Я понизил Breeze с версии 1.4.8 до версии 1.4.7, и этот исправил проблему, что проблема случалась реже.

(Единственное нарушение, указанное в changelog, заключается в том, что запросы contains должны быть экранированы в версии 1.4.7. t21 > перед выполнением .where("yourColumn", "contains", word))

Edit:

Нет, переход на 1.4.7 НЕ исправил это, он просто заставлял проблему встречаться реже.

Ответ 4

Хорошо, мы только что выпустили Breeze 1.4.9 с исправлением Mathias999us. Пожалуйста, сообщите нам, исправляет ли это проблему... или нет. Спасибо Матиасу;)

Ответ 5

Взглянув на код, Бриз ожидает, что "curContext.prevContext" или "context.prevContext" будет "null". Один из них должен быть "null" в этой проверке.

Ошибка возникает, когда и curContext.prevContext и context.prevContext уже установлены в значение.

Ответ 6

Для нашего приложения переключение на не-минимизированную (отладочную) версию breeze 1.4.8 устранила ошибку. Я не могу с уверенностью сказать, что это решит проблему для всех, так как я не знаю причину проблемы или как минимизация вызывает ошибку. Возможно, ошибка может произойти с неминифицированной версией, но это не в нашем приложении.

FWIW: Исходя из нашего опыта и того, что я читал от других, ошибка характеризуется тем, что она:

  • происходит только в последней версии Chrome (33) - windows и mac!
  • не всегда происходит.
  • похоже, имеет аспект времени. Для нас это происходит только в первых нескольких запросах бриза после запуска приложения, хотя это и не обязательно первый запрос.
  • возникает для каждого запроса после первого запроса, который терпит неудачу.