从讨论here看来,Redux减速器的状态应该保留在数据库中。Redux状态持久化与数据库
在这种情况下,用户身份验证等功能如何工作?
是否会创建一个新的状态对象来替换为每个用户(及其应用程序状态)创建和编辑数据库中的以前的状态?
会在前端使用所有这些数据并不断更新数据库中的状态吗?
编辑:我创建了一个example Redux auth project,这也正好体现了通用Redux,并且实时更新Redux,Socket.io和RethinkDB。
从讨论here看来,Redux减速器的状态应该保留在数据库中。Redux状态持久化与数据库
在这种情况下,用户身份验证等功能如何工作?
是否会创建一个新的状态对象来替换为每个用户(及其应用程序状态)创建和编辑数据库中的以前的状态?
会在前端使用所有这些数据并不断更新数据库中的状态吗?
编辑:我创建了一个example Redux auth project,这也正好体现了通用Redux,并且实时更新Redux,Socket.io和RethinkDB。
从这里的讨论看来,Redux reducer的状态应该保留在数据库中。
要坚持或不坚持这个状态,它可能不是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
,并在下一次应用程序运行时重新保存。
这些都是有效的担忧。使用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()
威力在这里有帮助)&将它存储在会话中。
感谢您的澄清。将用户凭据存储在数据库中有意义吗? – hoodsy
绝对!你仍然希望在后端存储信息,'localStorage'是暂时的,你不应该假设数据会持续30天以上。 'localStorage'的用例包括存储auth令牌,当前页面以及从后端加载的数据(以避免重新加载)。 Redux状态包含很多这些,这就是为什么在页面加载之间重新水合它是有道理的。将数据存储在后端通常是不明智的,有时不同的方法更有意义。 –
本地存储不应该**用于存储身份验证信息,因为它非常容易受到XSS攻击=>本地存储不是特定于域的,因此攻击者甚至不需要在您的站点中注入脚本以访问它 - 他们可以简单地让一个不知情的受害者去“{$ someEvilDomain} .com”,然后从那里运行一个脚本,在本地存储器中抓取所有内容** – Jordan
这非常有帮助 - 非常感谢您提供清晰的响应! – hoodsy