【问题标题】:Post Form Data to Array of Existing MongoDB Document using Express and Mongoose使用 Express 和 Mongoose 将表单数据发布到现有 MongoDB 文档数组
【发布时间】:2014-02-10 11:45:57
【问题描述】:

我正在尝试创建一个 Mongo 文档,然后将文档更新为表单以具有其他属性,其中一个属性具有对象数组。

我可以将除对象之外的所有内容保存到地址数组中。

以下代码 sn-ps 显示了我当前尝试将对象保存到地址数组。我觉得我错过了我尝试过但似乎无法正确语法的推动或转变。

Mongoose 架构:

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 }
    }]    
});

模型方法: 首先我创建一个帐户。表单只要求输入用户名、电子邮件、密码,然后重定向到玉文件,用户可以在其中填写表单的其余部分。

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);
    });
}

翡翠模板:(我相信这会更干净)

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

此外,还有另一种仅地址形式,这就是地址是数组的原因。

任何方向都会很有帮助,因为我可能随时会精神错乱。如果您有任何进一步的代码,请告诉我。

还有一点需要注意,我无法从更新函数中获取任何更新的数据以保存到 mongo。

谢谢!

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    这是我想出的解决方案。我找到要更新的文档并将对象推送到存储数组的属性。

    示例方法:

    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");
                    }
            })
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-16
      • 2019-10-09
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2020-09-26
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多