Задать вопрос
@PHPjedi

Ректные джедаи, где лучше всего разместить следующий код?

Добрый вечер!

У меня уже приложение готово! Ура-ура! Но есть следующий кусок кода, который я не могу найти "правильное" на интуитивном плане место.

if (localStorage.getItem('jwtToken')) {
    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
    store.dispatch(setCurrentUser(decoded_jwt));

    const current_time = Date.now() / 1000;

    if (current_time > decoded_jwt.exp) {
        store.dispatch(refresh())
    }
}


Я проверяю, а нет ли у нас токен в localStorage? Если есть, то сообщаем об этом (dispatch`им), а что если вдруг токен уже сгорел(протух), сообщаем об этом (сучим).

Вот можно вставить этот код где-то здесь (index.js):

import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import store from './redux/store';
import { BrowserRouter } from 'react-router-dom';
import App from './components/App';

ReactDOM.render(<Provider store={store}><BrowserRouter><App /></BrowserRouter></Provider>, document.getElementById('app'));


Сейчас он вот здесь (App.js - Component):

import React, { Component } from 'react';
import NavigationBar from "./NavigationBar";
import { Switch, Route } from 'react-router-dom';
import Home from "./Home.page";
import Login from "./Login.page";
import Register from "./Register.page";
import Profile from "./Profile.page";
import NotFound from "./NotFound.page";

import jwt_decode from 'jwt-decode';
import store from '../redux/store';
import { setCurrentUser, refresh } from '../redux/actions/authActions';

if (localStorage.getItem('jwtToken')) {
    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
    store.dispatch(setCurrentUser(decoded_jwt));

    const current_time = Date.now() / 1000;

    if (current_time > decoded_jwt.exp) {
        store.dispatch(refresh())
    }
}

class App extends Component {
    render() {
        return (
            <div>
                <header>
                    <NavigationBar/>
                </header>
                <main>
                    <Switch>
                        <Route exact path="/" component={Home}/>
                        <Route exact path="/login" component={Login}/>
                        <Route exact path="/register" component={Register}/>
                        <Route exact path="/profile" component={Profile}/>
                        <Route component={NotFound}/>
                    </Switch>
                </main>
            </div>
        );
    }
}

export default App;


1. Как вам идея разместить самый первый код (код проверки токена) в ComponentWillMount() в компоненте App (App.js)?

Посоветуйте, пожалуйста, куда грамотнее будет это вставить?

Заранее большое спасибо!
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
kshshe
@kshshe
Frontend developer
Предложение больше не по месту проверки, а по файловой структуре.
Можно завести файл вроде jwtTokenChecker.js, поместить туда функцию для проверки (чтобы не смешивать ее с другим файлом):
import jwt_decode from 'jwt-decode';

import store from './redux/store';
import { setCurrentUser, refresh } from './redux/actions/authActions';

export default () => {
	if (localStorage.getItem('jwtToken')) {
	    const decoded_jwt = jwt_decode(localStorage.getItem('jwtToken'));
	    store.dispatch(setCurrentUser(decoded_jwt));

	    const current_time = Date.now() / 1000;

	    if (current_time > decoded_jwt.exp) {
	        store.dispatch(refresh())
	    }
	}
}


Потом где-нибудь при ините, например, в index.js, когда стор уже готов, сделать так:
import checkJwtToken from './jwtTokenChecker';

checkJwtToken();


Что касается расположения, я бы поместил в index или в инит стора, потому что кажется, что без этих данных еще нет смысла рендерить приложение.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
ITK academy Нижний Новгород
от 80 000 до 120 000 ₽
ITK academy Воронеж
от 50 000 до 90 000 ₽