【问题标题】:Subdocument schemas not working子文档架构不起作用
【发布时间】:2017-05-25 17:22:19
【问题描述】:

我正在尝试构建一个包含子文档的 Mongoose 架构,这样我就可以拥有一个包含用户信息及其联系人的文档。这个想法是能够在联系人子文档上拥有 CRUD 功能,而无需单独的集合。

(对不起,说的很明显,只是想清楚)

所以父模式是“用户”,子模式是“联系人”...

我这样编写我的模型:

var UserSchema = new Schema({
    login: {
        type: String,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    email:{
        type: String,
        required: true
    },
    firstname:{
        type: String,
        required: false
    },
    lastname: {
        type: String,
        required: false
    },
    contacts:[ContactSchema]
})


var  ContactSchema = new Schema({
    contactFirstName:{ 
        type: String,
        required: true
    },
    contactLastName:{
        type: String,
        required: true
    },
    contactEmail: {
        type: String,
        required: true
    }
})

但是当我运行我的 API 时,我收到一条错误消息:

TypeError:架构数组路径contacts的值无效

我对 Mongoose 还很陌生,但据我所知,这就是您实现子文档的方式。

谁能看到我错过了什么?

这是我想在我的 Express API 中调用的示例路由:

router.route('/')

//CREATE NEW USER
.post(function(req, res){

  var user = new User();
  user.login = req.body.login;
  user.firstname = req.body.firstname;
  user.lastname = req.body.lastname;
  user.email = req.body.email;
  user.password = req.body.password;

  user.contacts.contactFirstName = req.body.contacts.contactFirstName;
  user.contacts.contactLastName = req.body.contacts.contactLastName;

  user.save(function(err){
    if(err)
      res.send(err);
    res.json({message:'User has been created'});
  })

})

【问题讨论】:

    标签: mongoose mongoose-schema


    【解决方案1】:

    在最新版本的 Mongoose 中,我认为 [someSchema] 是不必要的。你可以放一些Schema。所以没有数组括号。如果您使用的是旧版本,请尝试将 .add 与架构一起使用。所以像这样。

    var ContactSchema = new Schema(); ContactSchema.add({ contactFirstName:{ type : String, required: true }, contactLastName:{ type : String, required: true }, contactEmail: { type : String, required: true } })

    比将您的 contacts:[ContactSchema] 添加到 UserSchema

    【讨论】:

    • 谢谢@mrtaz。我尝试删除括号并在 (contacts:contactSchema) 之后直接调用 var 并得到相同的错误。我正在使用猫鼬 4.5.5。
    • 在用户上方添加联系人架构
    【解决方案2】:

    您走在正确的道路上,只是一个简单的错误。您在 UserSchema 中使用了 ContactSchema 却没有定义它,这就是它未定义的原因。

    在定义UserSchema之前定义你的ContactSchema,然后在联系人数组中使用它。它应该可以正常工作。

    var UserSchema = new Schema({
        //rest of the variables...
        lastname: {
            type: String,
            required: false
        },
        contacts:[ContactSchema]
    })
    
    
    var  ContactSchema = new Schema({
        contactFirstName:{ 
            type: String,
            required: true
        },
        //other variables...
    });
    

    更新:

    在创建新的user 时,您没有将user.contacts 定义为object,而是直接尝试将值分配给user.contacts.contactFirstNameuser.contacts.contactLastName。但是,由于 user.contact 没有定义,它是 undefined,因此 error: Cannot read property 'contactFirstName' of undefined 会出现。

    在为user.contacts.contactFirstNameuser.contacts.contactLastName 赋值之前添加user.contacts = {};

    user.contacts = {};//add this line
    user.contacts.contactFirstName = req.body.contacts.contactFirstName;
    user.contacts.contactLastName = req.body.contacts.contactLastName;
    

    【讨论】:

    • 谢谢拉维!在 PostMan 中进行测试的最佳方法是什么?
    • 谢谢拉维。我切换了它们,运行 API 时没有收到该错误。但是,当我尝试在 PostMan 中进行测试时,我尝试使用键“contacts.contactFirstName”添加其中一个字段,并收到一条未定义的消息:“”错误“:“无法读取未定义的属性 'contactFirstName'”“
    • 你想对邮递员做什么,我的意思是你在测试哪条路线?您可以发布您正在测试的路线代码吗?
    • 嗨 Ravi,我在上面添加了一条示例路线。
    猜你喜欢
    • 2014-07-10
    • 2017-06-08
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多