обновить базу данных без изменения пароля - PullRequest
0 голосов
/ 11 марта 2020

У меня есть приложение, в котором пользователи могут отслеживать еду грузовиков. На панели пользователя пользователи могут обновлять свое местоположение. После подтверждения обновления местоположения клиент отправляет запрос .put на серверную часть. Проблема заключается в том, что запрос .put обновляет каждое значение для объекта учетной записи пользователя (т. Е. Идентификатор, имя пользователя, адрес электронной почты, пароль и местоположение).

enter image description here

Во входе, который позволяет пользователю изменять свое местоположение, единственным измененным значением является местоположение. Тем не менее, я думаю, что есть ошибка, которая также меняет пароль. Пароль хранится в виде значения 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' });
        })
})


1 Ответ

1 голос
/ 11 марта 2020

Попробуйте отправить пустой пароль, если пароль не изменился, сохраните отдельную переменную для пароля, отличного от пароля пароля по умолчанию. В бэкэнде проверьте, не пуст ли он, а затем продолжите.

Бэкэнд :

router.put('/:id', (req, res) => {
    const { id } = req.params;
    let updatedDiner = req.body;
    updatedDiner.id = id;
    if (updatedDiner.password){
         const hash = bcrypt.hashSync(updatedDiner.password, 8);
         updatedDiner.password = hash;
       }
    else
   {
         delete updatedDiner.password
    }

    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' });
        })
})
...