Как можно отследить ошибку в Next.js?

Привет всем! <br/> У меня возникла проблема, с которой я никак не могу разобраться. <br/> Некоторые пользователи, особенно на iOS 16 и ниже, сталкиваются с ошибкой при доступе к сайту в браузере Сафари. Ошибка выглядит так: <br/> <blockquote>Application error: a client-side exception has occurred (see the browser console for more information)</blockquote> <br/> По данным метрики, такие ошибки возникают не на всех устройствах, и их количество довольно низкое, но мне важно понять причину и исправить её. <br/> Так как проект достаточно большой, самостоятельный поиск ошибки оказывается практически невозможным. <br/> <br/> После компиляции кода ошибка регистрируется в папке .next: <br/> <pre><code class="javascript">//.next/static/chunks/main.js

//./node_modules/next/dist/pages/_error.js
children: [\n                                    this.props.title || statusCode ? title : /*#__PURE__*/ (0, _jsxruntime.jsx)(_jsxruntime.Fragment, {\n                                        children: \"Application error: a client-side exception has occurred (see the browser console for more information)\"\n                                    }),\n</code></pre> <br/> <br/> У меня настроен ErrorBoundary, который должен регистрировать все ошибки и отправлять их в базу данных, что, кажется, он делает успешно. Тем не менее, в случае с текущей ошибкой не удаётся получить никакой информации о её причине. <br/> <pre><code class="javascript">class ErrorBoundary extends React.Component&lt;Props, State&gt; {
    constructor(props: any) {
        super(props)
        this.state = { hasError: false }
    }
    static getDerivedStateFromError(error: any) {
       return 
  • 23 ноября 2024 г. 18:33
Ответы на вопрос 2
отслеживание ошибок в приложении на Next.js может быть сложной задачей, особенно если ошибки возникают только на некоторых устройствах или браузерах. Чтобы помочь вам лучше понять и отслеживать ошибки, вот несколько стратегий, которые вы можете использовать:

### 1. Обновите ErrorBoundary

Несмотря на то, что у вас уже установлен `ErrorBoundary`, важно убедиться, что он правильно перехватывает ошибки и предоставляет достаточную информацию. Например, вам нужно убедиться, что вы сохраняете информацию об ошибке в состояние и передаете ее куда-то, чтобы вы могли ее просмотреть позже.

```javascript
class ErrorBoundary extends React.Component {
    constructor(props) {
        super(props);
        this.state = { hasError: false, errorInfo: null };
    }

    static getDerivedStateFromError(error) {
        return { hasError: true };
    }

    componentDidCatch(error, errorInfo) {
        // Тут вы можете отправить ошибку на сервер или в систему логов
        console.error("Error occurred:", error, errorInfo);
        this.setState({ errorInfo });
    }

    render() {
        if (this.state.hasError) {
            return (
                <div>
                    <h1>Что-то пошло не так.</h1>
                    <details>
                        {this.state.errorInfo && this.state.errorInfo.componentStack}
                    </details>
                </div>
            );
        }

        return this.props.children; 
    }
}
```

### 2. Используйте инструмент для сбора ошибок

Многие библиотеки позволяют отслеживать ошибки и одновременно предоставляют информацию о пользователе, устройстве и окружении, например:

- **Sentry**: Позволяет собирать ошибки и журналы, а также содержит отчеты о производительности. Интеграция с Sentry может дать вам множество деталей о том, что именно пошло не так.
- **LogRocket**: Позволяет записывать сессии пользователей и просматривать, что они делали перед ошибкой.

### 3. Логи на серверной стороне

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

- Информация о браузере и версии.
- Условия, при которых произошла ошибка (например, когда пользователь пытался выполнить определенное действие).

### 4. Проверка кода на специфические ошибки

Обратите внимание на специфические части вашего кода, которые могут работать неправильно в Safari:

- Использование современных функций JavaScript (например, `async/await`, `fetch`, etc.), которые могут не поддерживаться в некоторых версиях Safari. Используйте полифиллы или проверьте поддержку функций.

- Убедитесь, что вы корректно обрабатываете асинхронные вызовы и исключения.

### 5. Тестирование на реальных устройствах

Попробуйте воспроизвести ошибку на реальных устройствах с iOS 16 и ниже. Это может помочь вам понять, в каких именно условиях возникает ошибка и какие действия пользователей приводят к ней.

### 6. Убедитесь в обновлении библиотек

Иногда такие ошибки могут возникать из-за устаревших библиотек. Убедитесь, что вы используете последние версии библиотек, особенно если они взаимодействуют с DOM (например, библиотеки для анимации).

### Заключение

По совокупности всех этих шагов вы сможете создать более полную картину происходящего и сможете более эффективно отслеживать и предотвращать ошибки на вашем сайте.
Помог сервис app.lambdatest.com, зашел с нужного девайса и с нужно браузера на сайт, открыл консоль и увидел где косяк =)
Похожие вопросы