【问题标题】:POST request error: Path `title` and `body` are requiredPOST 请求错误:需要路径 `title` 和 `body`
【发布时间】:2020-11-03 23:21:01
【问题描述】:

我正在尝试向我的服务器发出 POST 请求以创建新帖子(标题、正文)并将其保存在数据库中,我收到 200 状态代码,但标题和正文没有被插入进入帖子。

更新:我刚刚将控制器方法中的 return res.status(400).json({ error: errorHandler(err) }) 更改为 res.send(err),现在我收到一条明确的错误消息:需要标题和正文路径。

我该如何解决这个问题?

CreatePost.js

 class CreatePost extends React.Component {
     constructor(props) {
         super(props)
     
         this.state = {
              title: '',
              body: ''
         }
     }
     
     changeHandler = (e) => {
         this.setState({ [e.target.name]: e.target.value })
     }
     

     submitHandler = e => {
         e.preventDefault()
         axios.post(`${API}/blog/post/create`, this.state)
         .then(response => {
             console.log(response)
         }).catch(error => {
             console.log(error)
         })
     }
    render() {
        const {title, body} = this.state
        return (
            <div>
                <form onSubmit={this.submitHandler}>
                <input type="text" name="title" 
                onChange={this.changeHandler} value={title} />
                <input type="text" name="body"
                onChange={this.changeHandler} value={body}/>
                <button type="submit">Submit</button>
                </form>
            </div>
        )
    }
}

export default CreatePost

控制器/post.js

exports.create = (req, res) => {
  let post = new Post()
  post.save((err, result) => {
    if(err) {
    return res.status(400).json({
        error: errorHandler(err)
    })
    }
    res.json(result)
    })
}

路由/posts.js

router.post('/blog/post/create', create);

【问题讨论】:

    标签: node.js reactjs express mern


    【解决方案1】:

    您是否尝试从PostmanInsomnia(我最喜欢的)调用您的端点来验证它是否已启动并运行?这是独立于代码测试端点的好方法。

    由于您的代码中没有使用 HTTP 404,我怀疑它来自 Express 的内部机制。

    顺便说一句,您的 API uri 中的动词 POST 和“创建”部分说明了相同的意图。你可以摆脱这个创建部分。这被认为是best practices 之一。

    【讨论】:

    • 感谢您的回答。我也在 Postman 中收到 404 错误。谢谢,我会从 uri 中删除 create
    【解决方案2】:

    试试这个。

    axios({ url: `${API}/blog/post/create`, method: 'POST', data: this.state})
    

    【讨论】:

    • 感谢您的回答,但这对我不起作用。 @凯文李
    【解决方案3】:

    我已经解决了这个问题。我实际上并没有将标题和正文插入到帖子对象中。

    我从req.body解构了titlebody
    const {title, body} = req.body
    并将数据插入到对象let post = new Post({title, body})中。

    控制器/posts.js

    exports.create = (req, res) => {
      const {title, body} = req.body
      let post = new Post({title, body})
    
      post.save()
      .then(response => {
      res.send(response)
        .catch(err => {
          res.send(err)
    })
    })
    }
    

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-11
      • 2018-08-09
      • 1970-01-01
      • 2022-01-04
      相关资源
      最近更新 更多