У меня есть приложение, в котором пользователи могут отслеживать еду грузовиков. На панели пользователя пользователи могут обновлять свое местоположение. После подтверждения обновления местоположения клиент отправляет запрос .put на серверную часть. Проблема заключается в том, что запрос .put обновляет каждое значение для объекта учетной записи пользователя (т. Е. Идентификатор, имя пользователя, адрес электронной почты, пароль и местоположение).
Во входе, который позволяет пользователю изменять свое местоположение, единственным измененным значением является местоположение. Тем не менее, я думаю, что есть ошибка, которая также меняет пароль. Пароль хранится в виде значения ha sh. Поэтому, когда сделан запрос на поставку, я думаю, что обновление местоположения onClick передает хешированное значение пароля для пользователя, которое затем меняет пароль в базе данных. Когда я пытаюсь войти в систему с пользователем, который только что изменил свое местоположение, я получаю сообщение об ошибке с неверными учетными данными из-за этого. Как я могу решить эту проблему?:
Вот действие, о котором идет речь:
// edit location for diners
export const editLocation = (changes, id) => dispatch => {
dispatch({ type: EDIT_LOCATION_START })
axiosWithAuth()
.put(`https://foodtrucktrackr.herokuapp.com/api/diner/${id}`, changes)
.then(res => {
console.log(res);
dispatch({ type: EDIT_LOCATION_SUCCESS, payload: res.data })
})
}
DinerDa sh. js (сжато только для соответствующих строк):
const DinerDash = props => {
const [locationEditMode, setLocationEditMode] = useState(false);
const [updatedAccount, setUpdatedAccount] = useState({
id: props.id,
username: props.username,
email: props.email,
password: props.password,
location: ''
})
const changeLocation = e => {
console.log(updatedAccount);
e.preventDefault();
props.editLocation(updatedAccount, props.id);
setLocationEditMode(false);
}
const handleLocationChange = e => {
setUpdatedAccount({
...updatedAccount,
location: e.target.value
})
}
return (
<div>
<h1>This is the diner Dashboard component</h1>
<h2>Welcome, {accountInfo.username}</h2>
<p>
Find trucks near: {props.location}
<ArrowDropDownCircleIcon
className="location-edit-icon"
onClick={() => setLocationEditMode(!locationEditMode)}
/>
</p>
{locationEditMode && <div>
<input placeholder="Enter a new location" onChange={handleLocationChange}/>
<button onClick={changeLocation}>Done</button>
</div>}
<br />
<button onClick={logout}>Logout</button>
</div>
)
}
const mapStateToProps = state => {
return {
id: state.account.id,
username: state.account.username,
email: state.account.email,
password: state.account.password,
location: state.account.location
}
}
код от редуктора:
case EDIT_LOCATION_START:
return {
...state,
isLoading: true
}
case EDIT_LOCATION_SUCCESS:
return {
...state,
isLoading: false,
account: {
id: action.payload.id,
username: action.payload.username,
email: action.payload.email,
password: action.payload.password,
location: action.payload.location
}
код от бэкэнда:
// how diners edit account
router.put('/:id', (req, res) => {
const { id } = req.params;
let updatedDiner = req.body;
updatedDiner.id = id;
const hash = bcrypt.hashSync(updatedDiner.password, 8);
updatedDiner.password = hash;
diners.editDiner(updatedDiner, id)
.then(updated => {
res.status(200).json(updated);
})
.catch(err => {
console.log(err);
res.status(500).json({ errorMessage: 'An error occured while updating account' });
})
})