ValidationError:猫鼬验证失败

时间:2018-09-08 10:23:19

标签: node.js mongoose

错误:

  

(节点:10164)UnhandledPromiseRejectionWarning:ValidationError:   产品验证失败:OEM:路径oem是必需的。类别:   路径category是必需的。       在新的ValidationError(C:\ Projects \ React \ ninjas \ neo \ node_modules \ mongoose \ lib \ error \ validation.js:30:11)       在model.Document.invalidate(C:\ Projects \ React \ ninjas \ neo \ node_modules \ mongoose \ lib \ document.js:1957:32)       在p.doValidate.skipSchemaValidators(C:\ Projects \ React \ ninjas \ neo \ node_modules \ mongoose \ lib \ document.js:1825:17)       在C:\ Projects \ React \ ninjas \ neo \ node_modules \ mongoose \ lib \ schematype.js:839:9       在_combinedTickCallback(内部/进程/next_tick.js:131:7)       在process._tickCallback(内部/进程/next_tick.js:180:9)(节点:10164)UnhandledPromiseRejectionWarning:未处理的承诺   拒绝。该错误是由抛出异步内部引起的   没有捕获块或拒绝承诺   未使用.catch()处理。 (拒绝ID:1)(节点:10164)[DEP0018]   DeprecationWarning:已弃用未处理的承诺拒绝。在   未来,未处理的承诺拒绝将终止   具有非零退出代码的Node.js进程。

//Product.js(model)
const mongoose = require('mongoose');

const ProductSchema = new mongoose.Schema({
    oem: {
        type: String,
        required: true
    },
    category: {
        type: String,
        required: true
    },
    date: {
        type: Date,
        default:Date.now
    }
});

module.exports = Product = mongoose.model('product', ProductSchema);

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

var Product = require('../models/Product');


router.get('/', (req, res) => {
  Product.find()
    .sort({ date: -1 })
    .then(prods => res.json(prods));
});

router.post('/newpro', (req, res) => {
    const newProduct = new Product({
      oem: req.body.oem,
      category: req.body.category
    });
    newProduct.save().then(prods => res.json(prods));
});



   

router.delete('/:id', (req, res) => {
  Product.findById(req.params.id)
    .then(prods => prods.remove().then(() => res.json({ success: true })))
    .catch(err => res.status(404).json({ success: false }));
});

module.exports = router;

1 个答案:

答案 0 :(得分:1)

router.post('/newpro', (req, res) => {
    const newProduct = new Product({
      oem: req.body.oem,
      category: req.body.category
    });
    newProduct.save().then(prods => res.json(prods));
});

您正在从oem请求的正文中获取categoryHTTP POST的值。

由于req.body.oemreq.body.category之一是null,因此引发了错误。

我不知道您是如何模拟HTTP REQUEST的,但请仔细检查,

如果您的HTTP REQUEST对您来说不错,我有第二个猜测,发现您没有使用body-parser middleware,请记住,req.body默认为undefined

从文档中

  

要求正文
  包含在请求正文中提交的键/值数据对。通过   默认情况下,它是未定义的,并且在使用body-parsing时填充   中间件,例如body解析器和multer。

所以也许将您的代码更改为以下代码可能会解决您的问题:

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


var bodyParser = require('body-parser');   
var Product = require('../models/Product'); 

router.use(bodyParser.json()); // for parsing application/json
router.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded

// rest of the code

但是在这种情况下,当您访问oemcategory时,它应该引发错误,因为req.bodyundefined by default。如果您有更多信息,请告诉我们。