简体   繁体   English

使用Express和Mongoose将表单数据发布到现有MongoDB文档数组中

[英]Post Form Data to Array of Existing MongoDB Document using Express and Mongoose

I'm attempting to create a Mongo document then update the document form a form to have additional properties, one of which has an array of objects. 我试图创建一个Mongo文档,然后将该文档从表单中更新为具有其他属性,其中一个具有对象数组。

I'm able to save everything except objects to the address array. 我可以将除对象以外的所有内容保存到地址数组。

The following code snippets show my current attempt to save an object to the address array. 以下代码段显示了我当前将对象保存到地址数组的尝试。 I feel like I'm missing a push or shift which I've tried and can't seem to get syntax correct. 我感觉好像错过了尝试或无法正确理解语法的推动或转变。

Mongoose Schema: 猫鼬架构:

var UserSchema = new mongoose.Schema({
     username: { type: String, lowercase: true }
    , password: { type: String }
    , email: { type: String, lowercase: true }
    , phone: { type: String }
    , newsletter: Boolean
    , created: { type: Date, default:   Date.now }
    , address: [{
        nickname: { type: String }
        , streetAddress: { type: String }
        , streetAddress2: { type: String }
        , state: { type: String }
        , zip: { type: String }
    }]    
});

Model Methods: First I create an account. 模型方法:首先,我创建一个帐户。 The form only asks for username, email, password then redirects to the jade file where users can fill out the rest of the form. 表单仅询问用户名,电子邮件,密码,然后重定向到jade文件,用户可以在其中填写其余的表单。

module.exports = exports = function(){
    //create account
    this.createAndSave = function (req, res ) {
        new User({
            username: req.body.username
            , password: req.body.password
            , email: req.body.email
            , phone: req.body.phone
            , address: [{
               nickname: req.body.nickname
               , streetAddress: req.body.streetAddress
               , streetAddress2: req.body.streetAddress2
               , state: req.body.state
               , zip: req.body.zip
            }]
        }).save(function (err, user){
            if (err) throw err;
            req.session.isLoggedIn = true;
            req.session.user = user.username;
            res.redirect('/account/' + user.username)
        })
    }

//update account
this.updateRequest = function (req, res) {
    User.update({username: req.user.username}, {
        username: req.body.username
        , email: req.body.email
        , phone: req.body.phone
        , newsletter: req.body.newsletter
        , address: [{
           nickname: req.body.nickname
           , streetAddress: req.body.streetAddress
           , streetAddress2: req.body.streetAddress2
           , state: req.body.state
           , zip: req.body.zip
        }]
      }, function (err) {
        res.redirect("/account/" + req.body.username);
    });
}

Jade Template: (I'm sure this could be cleaner) 玉模板:(我敢肯定这可能会更清洁)

h1 Edit User
#{user}
form(method="POST", action="/account/#{user.username}")
    input(type="hidden", name="_method", value="PUT")
    .form-group
        label(for="username") Name
        input#name.form-control(type="text", name="username", value= user.username )

    .form-group
        label(for="email") Email
        input#email.form-control(type="email", name="email", value= user.email )

    .form-group
        label Phone
        input#phone.form-control(type="text", name="phone", value= user.phone )

    .form-group
        label Newsletter Opt In/Out 
        input#newsletter(type="checkbox", name="newsletter", checked=(true===false ? "checked" : undefined))

    if(user.address.length > 0)
            for (var i = 0; i < user.shippingAddresses.length; i++) {}>)
                .form-group
                    label Street Address
                    input#address.form-control(type="text", name="streetAddress", value= user.shippingAddresses[i].streetAddress )

                .form-group
                    label Address Continued
                    input#address2.form-control(type="text", name="streetAddress2", value= user.shippingAddresses[i].streetAddress2 )

                .form-group
                    label Zip Code
                    input#zip.form-control(type="text", name="zip", value= user.shippingAddresses[i].zip )
    else
                .form-group
                    label Location Nick Name
                    input#address.form-control(type="text", name="nickname", value= )

                .form-group
                    label Street Address
                    input#address.form-control(type="text", name="streetAddress", value= )

                .form-group
                    label Address Cont.
                    input#address2.form-control(type="text", name="streetAddress2", value= )
                .form-group
                    label State
                    input#state.form-control(type="text", name="state", value= )
                .form-group
                    label Zip Code
                    input#zip.form-control(type="text", name="zip", value= )


    button(type="submit") Update Account

Additionally there is another address only form which is why the address is an array. 此外,还有另一种仅地址形式,这就是地址为数组的原因。

Any direction would be very helpful as I may go unhinged at any moment. 任何方向都将非常有帮助,因为我随时可能会感到烦躁。 If you any further code let me know. 如果您还有其他代码,请通知我。

Something else to note, I'm not able to get any of the updated data from the update function to save to mongo. 还有一些需要注意的地方,我无法从更新功能中获取任何更新后的数据以保存到mongo。

Thanks! 谢谢!

Here is the solution I came up with. 这是我想出的解决方案。 I find the document to update and push an object to the property that stores the array. 我找到要更新的文档,并将一个对象推到存储数组的属性中。

Example method: 示例方法:

this.addAddress = function (req, res) {
    var newAddress = {
           nickname: req.body.nickname,
           streetAddress: req.body.streetAddress,
           streetAddress2: req.body.streetAddress2,
           state: req.body.state,
           zip: req.body.zip
    }
    User.update({username: req.session.user}, { $push : {
            address: newAddress
        }}, {upsert: true}, function ( err ) {
                if(err){
                        console.log(err);
                }else{
                        console.log("Successfully added");
                }
        })
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM