POST请求上的Mongoose验证错误

时间:2015-07-10 18:57:21

标签: javascript node.js mongodb express mongoose

我正在尝试使用node.js上的express和mongoose为mongoDB执行POST请求但是使用Postman获取数据会给我这个错误:

  

MongooseError.ValidationError出错   (C:\ Users \用户利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\错误\ validation.js:22:16)
  在model.Document.invalidate   (C:\ Users \用户利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ document.js:1162:32)
  在   C:\ Users \用户利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ document.js:1037:16
  在验证   (C:\用户\利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ schematype.js:651:7)
  在   C:\ Users \用户利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ schematype.js:679:9
  在Array.forEach(native)
在   SchemaString.SchemaType.doValidate   (C:\用户\利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ schematype.js:656:19)
  在   C:\ Users \用户利玛\桌面\ APP1 \ node_modules \猫鼬\ lib中\ document.js:1035:9
  at process._tickCallback(node.js:355:11)

我在这里粘贴了我的server.js文件

var express = require('express')
var bodyParser = require('body-parser')
var mongoose = require('mongoose');
var app = express()
app.use(bodyParser.json())

mongoose.connect('mongodb://localhost/social', function(){
    console.log('mongodb connected')
})

var postSchema = new mongoose.Schema ({
    username : { type: String, required: true },
    body : { type: String, required: true },
    date : { type: Date, required: true, default: Date.now}
})
var Post = mongoose.model('Post', postSchema)

app.get('/api/posts', function(req, res, next){
    Post.find(function(err, posts){
        if(err) { return next(err) }
        res.json(posts)
    })
})

app.post('/api/posts', function(req, res, next){
    var post = new Post({
        username : req.body.username,
        body : req.body.body
    })
    post.save(function(err, post){
        if(err){ return next(err) }
        res.json(201, post)
    })
})

app.listen(3000, function(){
    console.log('Server listening on', 3000)
})

任何人都可以帮助我,或者这是猫鼬的问题吗?

3 个答案:

答案 0 :(得分:0)

我认为它是Mongoose Validation问题,req.body实际上是一个JSON格式化数据,console.log(req.body.username)返回用户名值。一般来说,尝试使用req.body,请在提交时填写必填字段。

app.post('/api/posts', function(req, res, next){
var post = new Post(req.body);
post.save(function(err, post){
    if(err){ return next(err) }
    res.json(post)
})
})

当用户无法填写必填字段时,最好处理MongooseError.ValidationError。尝试检查您的Mongoose模型。

答案 1 :(得分:0)

我今天遇到了类似的错误,阅读文档帮助我完成了。

医生说:

  

在mongoose中定义嵌套对象的验证器很棘手,因为嵌套对象不是完全成熟的路径。

var personSchema = new Schema({
  name: {
    first: String,
    last: String
  }
});

如上所述的模式会像你的问题一样抛出类似的错误。

文档指出了解决方法:

var nameSchema = new Schema({
  first: String,
  last: String
});

personSchema = new Schema({
  name: {
    type: nameSchema,
    required: true
  }
});

来源:http://mongoosejs.com/docs/validation.html

答案 2 :(得分:0)

在Postman中,要使用原始JSON数据测试HTTP发布操作,需要选择raw选项并设置标头参数(在postman中选择标头参数,然后添加 key:value 字段,如下)。

Content-Type: application/json

默认情况下,它带有 Content-Type: text/plain,需要替换为Content-Type: application/json