Безопасный для минимизации параметр catch в Javascript?

После минимизации моего приложения JavaScript с помощью подключаемого модуля Terser веб-пакета эта функция перехвата не работает правильно в браузере.

        .catch((error)=> {
            vm.loginError = true;
            vm.loading = false;

            if (!error || !error.error){return};

            if (error.error.indexOf('user exists')) {
                <!-- expecting this line to run when error.error contains "user exists" but this line is never executed -->
                vm.emailTakenError = true;
            } else {
                vm.serverGeneralError = true;
            }
        });

В этом примере серверная часть отправляет объект ошибки, содержащий свойство ошибки, для которого задано значение «пользователь существует».

{"status":"error","error_message":"user exists","error":"user exists"}

Браузер должен иметь возможность анализировать объект ошибки и читать error.error, но не может.

При использовании неминифицированного кода скрипт работает корректно и браузер выполняет строку «vm.emailTakenError = true».

В командной строке консоли браузера после минификации возврат error.error дает эту ошибку (Chrome Dev Tools):

Uncaught ReferenceError: ошибка не определена в eval (eval в (signup.ts:92), :1:1)

Как ни странно, используя исходные карты в минимизированном коде в Chrome Dev Tools, консоль может анализировать свойство error.error с помощью наведения мыши, но не как часы, ни в окне браузера, ни каким-либо другим методом.

Также загадочным образом эта строка никогда не выполняется:

if (!error || !error.error){return};

Код также не работает в Firefox.

У меня проблема с минификатором, с кодом или с чем-то еще? Как это решить?


person rikuwolf    schedule 11.10.2019    source источник
comment
error.error.indexOf('user exists') неверно, если вы проверяете, существует ли строка. Должно быть error.error.indexOf('user exists') !== -1. Неясно, связано ли это с вашей проблемой минификации, поскольку она даже не должна работать без минимизации.   -  person Ry-♦    schedule 11.10.2019
comment
Вы уверены, что ошибка именно из-за этого? Какова исходная (не сопоставленная с исходным кодом) трассировка стека для ошибки? eval определенно может связываться с минификаторами, и его не должно быть нигде в вашем коде. Даже если задействованы шаблоны или что-то в этом роде.   -  person Ry-♦    schedule 11.10.2019
comment
Спасибо @Ry. error.error.indexOf('пользователь существует') !== -1 Решено. Так совпало, что эта строка находилась в позиции 0 в нашем минимизированном коде, но не в неминифицированном коде, что характерно для разных сред.   -  person rikuwolf    schedule 11.10.2019


Ответы (1)


Тайна раскрыта благодаря @Ry.

Проблема заключалась в сочетании окружения и минификации.

В локальной (не минимизированной) среде серверная служба передает другую строку функции catch.

error.error.indexOf('user exists') == 148 // true

В нашей среде Staging/Prod мы получаем другие результаты, особенность нашего сервера.

error.error.indexOf('user exists') === 0 // true

Таким образом, error.error.indexOf('user exists') возвращает ложное значение, поэтому условие не выполняется.

Далее, оператор debugger не работает в минимизированном коде, по крайней мере, в этом случае.

person rikuwolf    schedule 11.10.2019