1
votes

Erreur de requête POST: les chemins `title` et` body` sont requis

J'essaie de faire une demande POST à mon serveur pour créer un nouveau message (titre, corps) et l'enregistrer dans la base de données et je reçois un code de statut 200 mais le titre et le corps ne sont pas insérés dans un message .

MISE À JOUR: Je viens de changer return res.status(400).json({ error: errorHandler(err) }) dans la méthode du contrôleur en res.send(err) et maintenant je reçois un message d'erreur clair: Le titre et les chemins du corps sont nécessaires.

Comment puis-je résoudre ça?

CreatePost.js

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

contrôleurs / 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)
    })
}

routes / posts.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


0 commentaires

3 Réponses :


1
votes

Avez-vous essayé d'appeler votre terminal depuis Postman ou Insomnia (mon préféré) pour vérifier qu'il est opérationnel? C'est une excellente méthode pour tester vos points de terminaison indépendamment de votre code.

Puisque vous n'utilisez pas HTTP 404 dans votre code, je soupçonne qu'il provient des mécanismes internes d'Express.

À propos, le verbe POST et la partie «créer» de l'URI de votre API indiquent la même intention. Vous pouvez vous débarrasser de cette partie de création. Ceci est considéré comme l'une des meilleures pratiques .


1 commentaires

Merci pour votre réponse. Je reçois également une erreur 404 dans Postman. Merci, je vais supprimer create de l'URI.



0
votes

Essayez avec ça.

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


1 commentaires

Merci pour votre réponse mais cela n'a pas fonctionné pour moi. @Kevin Li



0
votes

J'ai résolu le problème. Je n'insérais pas réellement le titre et le corps dans l'objet de publication.

J'ai déstructuré le title et le body de req.body :
const {title, body} = req.body
et inséré les données dans l'objet let post = new Post({title, body}) .

contrôleurs / 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)
})
})
}


0 commentaires