我正在try 使用SQL和Express构建CRUD,现在我正在try 在用户名已在数据库中注册时重定向用户,但当错误409发生时,即使我使用了try/catch块来处理错误,控制台也会显示:"Failed to load resource: the server responded with a status of 409 (Conflict)"并且带有导航至登录的行不会执行.

这是react 组件:

import React, { useState } from 'react'
import { Link, useNavigate } from 'react-router-dom'
import axios from 'axios'

const Register = () => {
  const [inputs, setInputs] = useState({
    username: '',
    email: '',
    password: ''
  });

  const [err, setError] = useState(null);

  const navigate = useNavigate();

  const handleChange = e => {
    setInputs(prev=>({...prev, [e.target.name]: e.target.value}))
  }

  const handleClick = async (e) => {
    e.preventDefault()  
    try{
      await axios.post('http://localhost:8800/api/auth/register', inputs);
      setTimeout(()=>{
        navigate("/login")
      }, "1500");
    } catch(err){
      setError(err.response.data)   
    }
  }

  return (
    <div className="auth">
      <h1>Register</h1>
      <form>
        <input required type="text" name='username' placeholder='Username' onChange={handleChange}/>
        <input required type="email" name='email' placeholder='Email' onChange={handleChange}/>
        <input required type="password" name='password' placeholder='Password' onChange={handleChange}/>
        <button onClick={handleClick}>Sign up</button>
        {err && <p>{err}</p>}
        <span>Already have an account? <br/><Link to='/login'>login!</Link></span>
      </form>
    </div>
  )
}

export default Register

这是express 控制器:

import { db } from '../db.js'
import bcrypt from 'bcryptjs'

export const register = (req, res) => {
    //check existing user
    const q = "SELECT * FROM blog.users WHERE email = ? OR username = ?;";
    
    db.query(q, [req.body.email, req.body.username], (err, data) => {
        if (err) return res.json(err)
        if(data.length) return res.status(409).json('user already exists!')

        // hash the password and create a user
        bcrypt.genSalt(10, (err, salt)=>{
            if(err){
                console.log(err)
                return res.status(500).json('error saving data');
            } 
            bcrypt.hash(req.body.password, salt, (err, hash) => {
                if(err){
                    console.log(err)
                    return res.status(500).json('error saving data');
                } 
                const password = hash;
                const q = "INSERT INTO blog.users(`username`, `email`, `password`) VALUES (?)";
                const values = [req.body.username, req.body.email, password]

                db.query(q, [values], (err, data) => {
                    if(err){
                    console.log(err)
                    return res.status(500).json('error saving data');
                } 
                    return res.status(200).json('User has been created');
                })
            })
        })


    })

}

export const login = (req, res) => {
    
}

export const logout = (req, res) => {
    
}

我try 了一切,所以如果有人能帮忙,我会很感激.

推荐答案

所有网络错误都会登录到控制台,这是浏览器这样做的,而不是您的代码.

您可以发现错误并重定向到那里,而不是"快乐路径".

示例:

const handleClick = async (e) => {
  e.preventDefault();

  try {
    await axios.post('http://localhost:8800/api/auth/register', inputs);

    // Successful registration, redirect to home page, dashboard, or anywhere
    navigate("/dashboard", { replace: true });
  } catch(err) {
    // already registered, redirect to login
    if (err.response.status === 409) {
      navigate("/login", { replace: true });
      return;
    }

    // Set error state with message
    setError(err.response.data);
  }
};

Javascript相关问答推荐

JavaScript替换子 node 导致它们更改为[对象HTMLTable SectionElement]

Node.JS ws包中是否有Webocket的错误代码列表?

类型错误:tasks.map不是函数(MERN堆栈)

追踪执行顺序

React存档iframe点击行为

如何修复循环HTML元素附加函数中的问题?

Vega中的模运算符

如何粗体匹配的字母时输入搜索框使用javascript?

切换时排序对象数组,切换不起作用

我们如何从一个行动中分派行动

如何将react—flanet map添加到remixjs应用程序

当id匹配时对属性值求和并使用JavaScript返回结果

从页面到应用程序(NextJS):REST.STATUS不是一个函数

将Node.js包发布到GitHub包-错误ENEEDAUTH

如何在.NET Core中将chtml文件链接到Java脚本文件?

是否可以在Photoshop CC中zoom 路径项?

JS Animate()方法未按预期工作

在不扭曲纹理的情况下在顶点着色器中旋转UV

用于部分字符串的JavaScript数组搜索

每隔3个项目交替显示,然后每1个项目交替显示