繁体   English   中英

尝试登录时出现 localStorage 问题

[英]localStorage issue when trying to login

将我的代码传输到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)
  }
}

使用 function 然后在 fetch 中并将您的代码放在那里,您将在 fetch 之前放置 await 语句,如下所示:请检查并告诉我

  const authenticateUser = async () => {
        try {
          const userData = { email, password }
          await fetch('http://localhost:4000/api/v1/auth/login', {
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
            },
            body: JSON.stringify(userData),
          }).then(function(response){
              if (response.data.status === 200) {
            localStorage.setItem('token', response.data.user.token)
          } else {
            throw new Error()
          }
          })
    
         
        } catch (err) {
          console.error(err)
        }
      }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM