После минимизации моего приложения 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.
У меня проблема с минификатором, с кодом или с чем-то еще? Как это решить?
error.error.indexOf('user exists')
неверно, если вы проверяете, существует ли строка. Должно бытьerror.error.indexOf('user exists') !== -1
. Неясно, связано ли это с вашей проблемой минификации, поскольку она даже не должна работать без минимизации. - person Ry-♦   schedule 11.10.2019eval
определенно может связываться с минификаторами, и его не должно быть нигде в вашем коде. Даже если задействованы шаблоны или что-то в этом роде. - person Ry-♦   schedule 11.10.2019