如何用mongoose和vue解决422错误

时间:2021-07-12 14:50:06

标签: api vue.js express mongoose axios

我正在使用带有 express 和 mongoose 的 API 将事件添加到我的数据库中,但是我在使用 axios 时出现错误 422,但使用 Postman 时却没有。

顺便说一下,我正在使用 Vue3 项目

错误是:加载资源失败:服务器响应状态为 422(不可处理实体)

这是我的 API 代码:

//Degustations.model.js
const mongoose = require('mongoose')

const degustationsSchema = new mongoose.Schema(
  {
    title: {
      type: String,
      required: true,
    },
    description: {
      type: String,
      required: true
    },
    price: {
        type: Number,
        required: true
    },
    places: {
        type: Number,
        required: true
    },
    places_left: {
      type: Number,
    },
    date: {
        type: String,
        required: true
    },
    image:{
        type: String,
    },
    ref:{
      type: String,
  }
  },
  {
    timestamps: true
  }
)

const Degustations = mongoose.model('degustation', degustationsSchema)

module.exports = {
  Degustations
}
// Degustations.ctrl.js

const Degustations = require('../models/degustations.model').Degustations
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
const xhr = new XMLHttpRequest()
xhr.withCredentials = true

module.exports = async (req, res, next) => {
  await Degustations
    .create(req.value.body)
    .then((inserted) => {
      console.log('✅ Success to add:', inserted._id)
      return res.status(201).json({
        message: `content ${result._id} created`,
        result: inserted,
      })
    })
    .catch((err) => {
      console.log('? Error to add:', err)
      if (err.code === 11000) {
        res
          .status(409)
          .json({ message: 'this address email already existing' })
      } else if (
        err.errors &&
        Object.keys(err.errors).length > 0 &&
        err.name === 'ValidationError'
      ) {
        res.status(422).json({ message: err.message })
      } else {
        res.status(500).json(err)
      }
    })
}

  function findAll(req, res) {
    return Degustations.find()
      .exec()
      .then((result) => {
        if (result.length > 0) {
          res.json(result)
        } else {
          res.status(202).json({ message: 'no users available' })
        }
      })
      .catch((err) => {
        res.status(500).json(err)
      })
  }

  function deleteById(req, res) {
    // Récupération de l'id
    const id = req.params.id
  
    // Requête Mongoose - https://mongoosejs.com/docs/api.html#model_Model.findByIdAndRemove
    return Content.findByIdAndRemove({ _id: id })
      .then((result) => {
        if (result) {
          // Présence d'un objet de données
          res.json({ message: `user ${id} deleted` })
        } else {
          // Ligne non existante
          res.status(404).json({ message: `degustation ${id} not found` })
        }
      })
      .catch((err) => {
        res.status(500).json(err)
      })
  }

module.exports = {
    saveOne,
    findAll,
    deleteById,
}

这是我的 axios 测试请求,我遇到了错误:

async addEvent() {
      this.axios.post("http://localhost:3000/api/v1/degustations", {
        data: {
          title: "eazeazea",
          description: "Venez profitez de ce truc là ouais",
          price: "15",
          places: "12",
          date: "2000-07-05T00:00:00.000Z",
          image: "",
          places_left: "8",
          ref: "prod_Jq4Z4YfZeMtOJi",
        },
      }).then((response) => console.log(response));
    }

但这里是邮递员生成的代码,它也不起作用,但简单的邮递员请求正在工作:

var axios = require('axios');
var qs = require('qs');
var data = qs.stringify({
  'title': 'eazeazea',
  'description': 'Venez profitez de ce truc là ouais',
  'price': '15',
  'places': '12',
  'date': '2000-07-05',
  'image': '',
  'places_left': '8',
  'ref': 'prod_Jq4Z4YfZeMtOJi' 
});
var config = {
  method: 'post',
  url: 'http://localhost:3000/api/v1/degustations',
  headers: { 
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

有人知道如何解决这个错误吗?

这是我的路线代码:

// index.routes.js
const express = require('express')
const router = express.Router()

// Endpoint des utilisateurs
router.use('/api/v1/content', require('./content.routes'))
router.use('/api/v1/users', require('./users.routes'))
router.use('/api/v1/degustations', require('./degustations.routes'))

module.exports = router

//Degustations.routes.js
const express = require('express')
const router = express.Router()
const Degustations = require('../controllers/degustations.ctrl')
const m = require('../helpers/middlewares')

router.post('/', Degustations.saveOne);
router.get('/', Degustations.findAll);


module.exports = router

1 个答案:

答案 0 :(得分:0)

1- 要在路由中传递一些函数,最好的方法是在控制器函数中使用 module.exports。

2- 我认为你可以创建 async/await 函数。

3- 否则我有更改功能来创建猫鼬, 来简化事情。请向我们提供一些更新。

4- 在此处阅读有关出口声明的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export

看看下面的代码:

       module.exports = {
       async insert (req, res, next) => {
        await Degustations
          .create(req.value.body)
          .then((inserted) => {
            console.log('✅ Success to add:', inserted._id)
            return res.status(201).json({
              message: `content ${result._id} created`,
              result: inserted,
            })
          })
          .catch((err) => {
            console.log('? Error to add:', err)
            if (err.code === 11000) {
              res
                .status(409)
                .json({ message: 'this address email already existing' })
            } else if (
              err.errors &&
              Object.keys(err.errors).length > 0 &&
              err.name === 'ValidationError'
            ) {
              res.status(422).json({ message: err.message })
            } else {
              res.status(500).json(err)
            }
          })
      },
      async findAll() {
        // ... your code here ... 
      },
      async deleteById() {
        // ... your code here ... 
      },
    }

    // to import you can use 
    const {insert, findAll, deleteById} = require('../controllers/degustations.ctrl')
    // OR
    const degustations  = require('../controllers/degustations.ctrl')
    degustations.insert()
    degustations.findAll()
    degustations.deleteById()