gpt4 book ai didi

javascript - 尝试登录时的 localStorage 问题

转载 作者:行者123 更新时间:2023-12-05 04:38:41 27 4
gpt4 key购买 nike

将我的代码传输到 async-await 后,发生了 localStorage 问题。谁能告诉我问题是什么以及如何克服它?

登录页面代码:

import React, { useState } from 'react'
import {
CButton,
CCard,
CCardBody,
CCardGroup,
CCol,
CContainer,
CForm,
CFormInput,
CInputGroup,
CInputGroupText,
CRow,
} from '@coreui/react'
import CIcon from '@coreui/icons-react'
import { cilLockLocked, cilUser } from '@coreui/icons'

const Login = () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')

const authenticateUser = async () => {
try {
const userData = { email, password }
const _data = await fetch('http://localhost:4000/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData),
})

if (_data.status === 200) {
localStorage.setItem('token', _data.user.token)
} else {
throw new Error()
}
} catch (err) {
console.error(err)
}
}

return (
<div className="bg-light min-vh-100 d-flex flex-row align-items-center">
<CContainer>
<CRow className="justify-content-center">
<CCol md={8}>
<CCardGroup>
<CCard className="p-4">
<CCardBody>
<CForm>
<h1>Login</h1>
<p className="text-medium-emphasis">Sign In to Dashboard</p>
<CInputGroup className="mb-3">
<CInputGroupText>
<CIcon icon={cilUser} />
</CInputGroupText>
<CFormInput
placeholder="Email"
autoComplete="email"
onChange={(e) => setEmail(e.target.value)}
/>
</CInputGroup>
<CInputGroup className="mb-3">
<CInputGroupText>
<CIcon icon={cilLockLocked} />
</CInputGroupText>
<CFormInput
type="password"
placeholder="Password"
autoComplete="current-password"
onChange={(e) => setPassword(e.target.value)}
/>
</CInputGroup>
<CRow>
<CCol xs={6}>
<CButton
color="primary"
className="px-4"
onClick={() => authenticateUser()}
>
Login
</CButton>
</CCol>
<CCol xs={6} className="text-right">
<CButton color="link" className="px-0">
Forgot password?
</CButton>
</CCol>
</CRow>
</CForm>
</CCardBody>
</CCard>
</CCardGroup>
</CCol>
</CRow>
</CContainer>
</div>
)
}

export default Login

登录详细信息显示在 Postman 中:

{
"user": {
"token": "token here"
}
}

控制台显示错误:

TypeError: Cannot read properties of undefined (reading 'token')
at authenticateUser (Login.js:34)

从这个方法来看,代码运行完美。

fetch('http://localhost:4000/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData),
})
.then((response) => response.json())
.then((data) => {
localStorage.setItem('token', data.user.token)
history.push('/dashboard')
})
.catch((error) => {
console.error('Error:', error)
})

最佳答案

这与 localStorage 没有任何关系,但顺便说一下,您正在使用 fetch。您忘记阅读 response 正文 ...

const authenticateUser = async () => {
try {
const userData = { email, password }
const response = await fetch('http://localhost:4000/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData),
})

if (response.status === 200) {
let data = await response.json(); // <-- read json data from the response here
localStorage.setItem('token', data.user.token)
} else {
throw new Error()
}
} catch (err) {
console.error(err)
}
}

关于javascript - 尝试登录时的 localStorage 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70551507/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com