无法显示正确的错误信息

Unable to display the right error message

我正在尝试在 MERN 堆栈应用程序中实施用户身份验证。

这是我正在尝试做的事情:

我在前端有一张注册表。当用户第二次使用与第一次相同的电子邮件 ID 注册时,应在注册表顶部的前端显示一条消息“用户已注册” .我正在从后端以 JSON 格式发回此响应(“用户已注册”),错误代码为 400。代码如下所示。

const express = require('express');
const asyncHandler = require('express-async-handler');
const User = require('../models/userModel');
const generateToken = require('../utils/generateToken');

const router = express.Router();

router.post('/', asyncHandler(async (req, res, next) => {
    const {name, email, password} = req.body;

    const userExists = await User.findOne({email});

    if(userExists) {
        res.status(400).json({message: 'User already registered'});
    }

    const user = await User.create({
        name,
        email,
        password
    })

    if(user) {
        res.status(201).json({
            _id: user._id,
            name: user.name,
            token: generateToken(user._id)
        })
    } else {
        res.json({message: 'Invalid user data'});
    }
}));

module.exports = router;

我面临的问题是,显示的消息不是“用户已注册”,而是“请求失败,状态代码为 400”。

当我检查“网络”选项卡时,我看到消息“用户已注册”作为响应从服务器返回。

以下是注册表的完整代码。

import React, {useState} from 'react'
import {useFormik} from 'formik'
import * as Yup from 'yup';
import axios from 'axios';

const RegisterScreen = ({history}) => {

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

    const formik = useFormik({
      initialValues: {
        name: '',
        email: '',
        password: "",
      },
      validationSchema: Yup.object({
        name: Yup.string()
          .max(15, 'Must be 15 characters or less')
          .required('Required'),
          email: Yup.string()
            .email('Invalid email address')
            .required('Required'),
          password: Yup.string()
            .required('Required')
      }),
      onSubmit: async (values, {resetForm}) => {
        try {
          const response = await axios.post('/api/users', values);
          history.push('/login');

        } catch (ex) {
          console.error(ex);
          setError(ex);
          }
      },
    });
    return (
      <form onSubmit={formik.handleSubmit}>
          <div className="form-group col-md-4 mx-auto mt-5">
              {error && <div className="alert alert-danger" role="alert">{error.message}</div>}
              <label htmlFor="firstName">Name</label>
              <input
                  className="form-control"
                  id="name"
                  name="name"
                  type="text"
                  onChange={formik.handleChange}
                  onBlur={formik.handleBlur}
                  value={formik.values.name}
              />
              {formik.touched.name && formik.errors.name ? <small className="form-text text-danger">{formik.errors.name}</small>:null}
          </div>
          <div className="form-group col-md-4 mx-auto">
              <label htmlFor="email">Email Address</label>
              <input
                  className="form-control"
                  id="email"
                  name="email"
                  type="email"
                  onChange={formik.handleChange}
                  onBlur={formik.handleBlur}
                  value={formik.values.email}
              />
              {formik.touched.email && formik.errors.email ? <small className="form-text text-danger">{formik.errors.email}</small>:null}
          </div>
          <div className="form-group col-md-4 mx-auto">
              <label htmlFor="password">Password</label>
              <input
                  className="form-control"
                  id="password"
                  name="password"
                  type="text"
                  onChange={formik.handleChange}
                  onBlur={formik.handleBlur}
                  value={formik.values.password}
              />
              {formik.touched.password && formik.errors.password ? <small className="form-text text-danger">{formik.errors.password}</small>:null}
   
          </div>

          <div className="col-md-4 mx-auto">
        <button type="submit" className="btn btn-primary">Register</button>
        </div>
      </form>
    );
  };
   
  export default RegisterScreen;

我做错了什么?我希望显示“用户已注册”,而不是“请求失败,状态代码为 400”。

您的错误信息将在

error.response.data.message

不在

error.message

在 Axios 中,您可以在 error.response.data

中获取从服务器发送的 json 数据

这里是 link 来处理 axios

的错误