У меня есть сайт ASP.NET, на котором у меня возникают проблемы с поиском некоторых ошибок JavaScript только при ручном тестировании.
Есть ли возможность поймать все ошибки JavaScript на стороне клиента и зарегистрировать их на сервере, то есть в журнале событий (через веб-сервис или что-то в этом роде)?
Я предполагаю, что вы не имеете в виду, что средний пользователь внес вклад (иначе это XSS-дыра) ... но ... вы могли бы изолировать их JS в try / catch, чтобы это, по крайней мере, не повлияло на ваш собственный JS ... не зная динамика сайта, не знаю, поможет это или нет ...
Контент поступает от других команд в Компании, а не от пользователей, поэтому это не представляет угрозы для безопасности.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы потенциально можете сделать Ajax-вызов сервера из try / catch, но, вероятно, это лучшее, что вы можете сделать.
Могу я предложить вместо этого модульное тестирование JavaScript? Возможно с JSUnit?
Проблема, по которой мы не используем JavaScript UnitTesting, заключается в том, что слишком много людей вносят свой вклад в Сайт / Контент, и они используют JavaScript (но понятия не имеют об этом!), Поэтому общее решение было бы лучше.
Вы можете попробовать настроить свой собственный обработчик для событие onerror и использовать XMLHttpRequest, чтобы сообщить серверу, что пошло не так, однако, поскольку он не является частью какой-либо спецификации, поддержка несколько ненадежная.
Вот пример из Использование XMLHttpRequest для регистрации ошибок JavaScript:
window.onerror = function(msg, url, line)
{
var req = new XMLHttpRequest();
var params = "msg = " + encodeURIComponent(msg) + '&url=' + encodeURIComponent(url) + "&line = " + line;
req.open("POST", "/scripts/logerror.php");
req.send(params);
};
Я только что выпустил серверный элемент управления, который поможет вам сделать это на thecodepage.com/post/JavaScript-Error-Notifications.aspx
Будет ли он бесконечно зацикливаться, если произойдет сбой в обработчике?
@ Жан-Филипп Леклерк: Да. И что еще хуже, это приведет к DoS-атаке на конечную точку вашего сервера, если вы когда-нибудь попадете в цикл ошибок. Вы должны добавить к этому функцию дросселирования, чтобы предотвратить слишком быстрое обращение клиента к серверу. Вот пример этого из {Track: js} github.com/TrackJs/Tech-Demo/blob/master/src/TrackJs.Demo/…
Вы также можете зашифровать токен, который включает идентификатор пользователя, IP-адрес, небольшую случайную строку (для предотвращения атак с открытым текстом, если ваш алгоритм шифрования быстрый, но слабый) и метку времени, и включить ее в качестве переменной JS на странице. Затем его можно отправить вместе с отчетом об ошибке и проверить, прежде чем разрешить добавление в журналы. Это помогает доказать вероятную подлинность сообщения об ошибке и защищает от глупых DoS-атак, но все же не защитит вас от более изощренных DoS-попыток, как это делает дросселирование.
Эта штука может перегрузить ваш сервер, например. если вы получаете ошибку в методе setInterval. В Интернете доступно множество сервисов отчетов об ошибках JS. Оформить заказ ErrLytics. Он также дает вам аналитику каждого действия пользователя на вашем веб-сайте.
Существуют ли риски безопасности, связанные с вызовом ajax, который (вероятно) будет записывать на диск любое полученное сообщение? Я могу вспомнить атаку Министерства обороны, заполняющую жесткий диск или замедляющую его реакцию ... Как бы вы от этого защитились?
Также рекомендую использовать утилиту TraceTool, она поддерживает JavaScript и очень удобна для мониторинга JS.
Если вы хотите записывать ошибки на стороне клиента обратно на сервер, вам придется выполнить какую-то обработку сервера. Лучше всего иметь веб-службу, к которой вы можете получить доступ через JavaScript (AJAX), и вы передадите ей информацию из журнала ошибок.
Не решает проблему на 100%, потому что если проблема связана с веб-сервером, на котором размещена веб-служба, у вас проблемы, другим вариантом будет отправка информации через стандартную страницу через строку запроса. это делается посредством динамической генерации тегов изображений (которые затем удаляются), когда браузер попытается загрузить источник изображения. Тем не менее, он прекрасно обходит междоменные вызовы JavaScript. Имейте в виду, что у вас проблемы, если у кого-то отключены изображения;)
Я только что реализовал регистрацию ошибок на стороне сервера при ошибках javascript в рабочем проекте. Это смесь старого кода и нового кода, использующего jQuery.
Я использую комбинацию window.onerror и обертываю обработчики событий jQuery и функцию onready функцией обработки ошибок (см. Отслеживание ошибок JavaScript: почему window.onerror недостаточно).
window.onerror: перехватывает все ошибки в IE (и большинство ошибок в Firefox), но ничего не делает в Safari и Opera.Как только я обнаружил ошибку, я добавляю к ней дополнительные свойства (URL, браузер и т. д.), А затем отправляю их обратно на сервер с помощью вызова ajax.
На сервере у меня есть небольшая страница, которая просто принимает опубликованные аргументы и выводит их в нашу обычную структуру ведения журнала сервера.
Я хотел бы открыть исходный код для этого (как плагин jQuery). Если кому интересно, дайте знать, это поможет убедить начальство!
Есть ли шанс, что этот код будет доступен?
К сожалению, нет :(, так как я больше не работаю в компании, в которой я создал этот код. Но это было всего около 100 строк кода, и его должно быть достаточно легко воссоздать из деталей выше.
вот тут ребята: webcache.googleusercontent.com/…
Я пробовал это, но сохранение jquery в зависимости - это боль, а window.onerror отстой для минимизированного кода и javascript, который обслуживается через cdns
Короткий ответ: Да, это возможно.
Более длинный ответ: Люди уже писали о том, как можно (хотя бы частично) решить эту проблему, написав собственный код. Однако обратите внимание, что существуют службы, которые, похоже, убедились, что необходимый код JS работает во многих браузерах. Я нашел следующее:
Я не могу говорить ни об одной из этих услуг, так как еще не пробовал их.
Зарегистрировано на muscula.com. Сервис выглядит очень интересно, его легко интегрировать и использовать. Существует также библиотека JavaScript github.com/csnover/TraceKit, которая позволяет получать информацию об исключении от клиента, но вам необходимо разработать свой собственный механизм входа на стороне сервера. Интересно, можно ли для этого использовать Google Analytics?
В дополнение к приведенному выше списку есть также бесплатный log4sure.com, а также мониторинг журналов в реальном времени. Вы также можете создать свою собственную таблицу журналов
Я бы еще добавил ошибка
Недавно я использовал Appfail, который фиксирует ошибки как asp.net, так и JavaScript.
Если вы используете Google Analytics, вы можете регистрировать ошибки JavaScript в событиях Google Analytics.
См. Это приложение: http://siteapps.com/app/log_javascript_errors_with_ga-181
Надеюсь, это поможет.
Эта ссылка больше не работает. Вы можете найти статью о регистрации ошибок Javascript с помощью Google Analytics на странице developers.google.com/analytics/devguides/collection/….
Проблема, по которой мы не используем JavaScript UnitTesting, заключается в том, что слишком много людей вносят свой вклад в Сайт / Контент и используют JavaScript. Контент - это не то, о чем мы (как разработчики) должны заботиться, но в коде есть ошибки. Так что общее решение было бы лучше.