Я искал простую систему входа / регистрации и наткнулся на этот урок:
http://jasonwatmore.com/post/2017/09/16/react-redux-user-registration-and-login-tutorial-example
Я попробовал это и добавил настоящий mongoDB Backend для удаления Mock-Backend. Это был мой первый раз, когда я делал Redux, но после долгой борьбы все работает отлично! Вы можете увидеть результат здесь:
https://genko.de/login
Только одна вещь не работает вообще, и я понятия не имею, как ее решить. Поскольку я хочу избежать начальной загрузки, у меня большая проблема с обработкой ошибок.
Я хочу отобразить снэк-бар из Material-Ui для следующих случаев:
- Неверное имя пользователя или пароль
- Успешно авторизован
- Имя пользователя уже занято (регистрация)
На самом деле в моих файлах-редуксах уже есть некоторые действия и редукторы, но, если честно, я просто скопировал их из учебника и понятия не имею, как с ними работать.
Следующая кнопка запускается кнопкой входа в систему:
handleSubmit(e) {
e.preventDefault();
this.setState({ submitted: true });
const { username, password } = this.state;
const { dispatch } = this.props;
if (username && password) {
dispatch(userActions.login(username, password))
}
}
И это моя функция входа в систему (user.actions):
function login(username, password) {
return dispatch => {
dispatch(request({ username }));
userService.login(username, password)
.then(
user => {
dispatch(success(user));
history.goBack();
},
error => {
dispatch(failure(error.toString()));
dispatch(alertActions.error(error.toString()));
}
);
};
function request(user) { return { type: userConstants.LOGIN_REQUEST, user } }
function success(user) { return { type: userConstants.LOGIN_SUCCESS, user } }
function failure(error) { return { type: userConstants.LOGIN_FAILURE, error } }
}
alert.actions:
import { alertConstants } from '../_constants';
export const alertActions = {
success,
error,
clear
};
function success(message) {
return { type: alertConstants.SUCCESS, message };
}
function error(message) {
return { type: alert, message };
}
function clear() {
return { type: alertConstants.CLEAR };
}
И, наконец, мои оповещения. Константы:
export const alertConstants = {
SUCCESS: 'ALERT_SUCCESS',
ERROR: 'ALERT_ERROR',
CLEAR: 'ALERT_CLEAR'
};
У вас есть намеки на меня или предложения?
С наилучшими пожеланиями:)
EDIT:
Я забыл показать вам свое промежуточное программное обеспечение NodeJS Global Error Handler из этого учебного руководства для замены торцевого бэкэнда:
module.exports = errorHandler;
function errorHandler(err, req, res, next) {
if (typeof (err) === 'string') {
// custom application error
return res.status(400).json({ message: err });
}
if (err.name === 'ValidationError') {
// mongoose validation error
return res.status(400).json({ message: err.message });
}
if (err.name === 'UnauthorizedError') {
// jwt authentication error
return res.status(401).json({ message: 'Invalid Token' });
}
// default to 500 server error
return res.status(500).json({ message: err.message });
}