使用 Axios 发布数据时出错 - MERN 堆栈

Error when Posting Data with Axios - MERN Stack

我正在尝试测试模型的验证,特别是 name 变量是否具有特定长度。我在 http://localhost:3000/ 有一个前端设置 React + axios 和一个后端设置 express + node.

我在前端的 package,json 文件中设置了一个代理以包含 "proxy": "http://localhost:3001" 并确保我的后端包含已启用的 CORS 策略:

const app = express()
const cors = require('cors')
app.use(cors())

然而,当我 post 数据时,虽然验证输出确实显示在后端控制台中,但前端显示为空白屏幕并且错误显示在前端控制台中。我的目标是让错误信息出现在前端。

前端错误:

后端输出(精细):

这是我在前端调用 axios 的函数。在调用 personService 对象时在最后一个 catch 块中捕获的实际创建新用户时应该会发生错误:

     const personObj = {
      name: newName,
      number: newPhone
    }

    //Updating database and states
    phoneService
      .create(personObj)
      .then(person => {
        setPersons(persons.concat(person))

        //Filter
        setNewPhone("")
        setNewName("")
      }).catch(error => {

        setMessage(
          error.response.data
        )
        setMessageType("phone-error-add")
        console.log(error.response.data)
        return
      })

    setMessage(
      `Added ${personObj.name}`
    )
    setMessageType("phone-added")

    setTimeout(() => {
      setMessage(null)
    }, 2000)

  }

这是 Axios PhoneService 文件:

import axios from 'axios'
const baseUrl = '/api/persons'

const getAll = () => {
  const request =  axios.get(baseUrl)
  return request.then(response => response.data)
}

const create = newObject => {
  
    const request = axios.post(baseUrl, newObject)
    return request.then(response => response.data)
}

const update = (id, newObject) => {
    const request = axios.put(`${baseUrl}/${id}`, newObject)
    return request.then(response => response.data)
}

const deleteData = id => {
    const request = axios.delete(`${baseUrl}/${id}`)
    return request
}


export default { 
  getAll, 
  create, 
  update,
  deleteData
}

这是在后端调用的post函数

app.post('/api/persons', (request, response, next) => {

    const body = request.body

    if (!body.name || !body.number) {
        return response.status(400).json({ error: 'Name or phone number is missing' })
    }

    const person = new Person({
        name: body.name,
        number: body.number,
    })

    person.save().then(savedPerson => {
        response.json(savedPerson)
    })
    .catch(error => next(error))
    // console.log(process.stdout)
})

这是后端的错误处理中间件,它输出第二张图片中的错误:

const errorHandler = (error, request, response, next) => {
    console.error(error.message)

    if (error.name === 'CastError') {
        return response.status(400).send({ error: 'malformatted id' })
    } else if (error.name === "ValidationError") {
        return response.status(400).json({ error: error.message })
    }

    next(error)
}

// this has to be the last loaded middleware.
app.use(errorHandler)

您不能在 React 中渲染对象。 假设服务器的响应类似于

res = {error: "error message"}

不允许只对渲染做出反应

<div>{res}</div>

你必须渲染

<div>{res.error}</div>