Настойчивость состояния Redux с базой данных
Из обсуждения здесь кажется, что состояние редукторов Redux должно сохраняться в базе данных.
Как в этом случае работает пользовательская аутентификация?
Не будет ли создан новый объект состояния для замены предыдущего состояния в базе данных для каждого пользователя (и состояния приложения), созданного и отредактированного?
Будет ли использовать все эти данные на передней панели и постоянно обновлять состояние в базе данных?
Изменить: Я создал пример проекта Redux auth, который также является примером универсального Redux и обновление в реальном времени с помощью Redux, Socket.io и RethinkDB.
Ответы
Ответ 1
Из обсуждения здесь кажется, что состояние редукторов Redux должно сохраняться в базе данных.
Чтобы сохранить состояние или нет, скорее всего это не проблема Redux. Это больше подходит к логике приложений.
Если что-то происходит в приложении, например, загрузка данных на сервер, очевидно, вам нужно сохранить состояние (или срез состояния на сервер).
Так как сетевые вызовы асинхронны, но Redux синхронно - вам нужно ввести дополнительное промежуточное ПО, redux-thunk или redux-promise.
В качестве регистрационного примера вам, вероятно, понадобятся эти действия,
export function creatingAccount() {
return { type: 'CREATING_ACCOUNT' };
}
export function accountCreated(account) {
return { type: 'ACCOUNT_CREATED', payload: account };
}
export function accountCreatingFailed(error) {
return { type: 'ACCOUNT_CREATING_FAILED', payload: error };
}
export function createAccount(data, redirectParam) {
return (dispatch) => {
dispatch(creatingAccount());
const url = config.apiUrl + '/auth/signup';
fetch(url).post({ body: data })
.then(account => {
dispatch(accountCreated(account));
})
.catch(err => {
dispatch(accountCreatingFailed(err));
});
};
}
Некоторая часть состояния, например. пользовательский объект после авторизации может быть сохранен в localStore
и повторно увлажнен при следующем запуске приложения.
Ответ 2
Это действительные проблемы. Использование localStorage
для сохранения состояния в интерфейсе может быть лучшей стратегией. Вы можете реализовать это с помощью промежуточного программного обеспечения, например:
import {createStore, compose, applyMiddleware} from 'redux';
const localStorageMiddleware = ({getState}) => {
return (next) => (action) => {
const result = next(action);
localStorage.setItem('applicationState', JSON.stringify(
getState()
));
return result;
};
};
const store = compose(
applyMiddleware(
localStorageMiddleware
)
)(createStore)(
reducer,
JSON.parse(localStorage.getItem('applicationState'))
)
Если вы беспокоитесь о том, что противник обращается к ноутбуку пользователя и крадет учетные данные из него, вы можете сохранить состояние бэкэнд, когда пользователь покинет страницу (Navigator.sendBeacon()
может быть здесь полезен) и сохраните его в сеансе.