使用Express和Mongoose将表单数据发布到现有MongoDB文档的数组 [英] Post Form Data to Array of Existing MongoDB Document using Express and Mongoose

查看:127
本文介绍了使用Express和Mongoose将表单数据发布到现有MongoDB文档的数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



m能够将除物体之外的所有东西保存到地址数组。



以下代码片段显示了我当前尝试将对象保存到地址数组。我觉得我错过了我尝试的推送或移位,似乎无法得到正确的语法。



Mongoose Schema:

  var UserSchema = new mongoose.Schema({
username:{type:String,lowercase:true}
,密码:{type:String}
,电子邮件:{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(){
//创建帐户
this.createAndSave = function(req,res){
new User({
username:req。 body.username
,密码:req.body.password
,电子邮件:req.body.email
,电话:req.body.phone
,地址:[{
昵称: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)
})
}

//更新帐户
this.updateRequest = function(req,res){
User.update ({username:req.user.username},{
username:req.body.username
,email:req.body.email
,phone:req.body.phone
,通讯:req.body.newsletter
,地址:[{
昵称: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编辑用户
#{user}
form(method =POST ,action =/ account /#{user.username})
input(type =hidden,name =_ method,value =PUT)
.form-group
label(for =username)名称
输入#name.form-control(type =text,name =username,value = user.username)

.form -group
label(for =email)电子邮件
input#email.form-control(type =email,name =email,value = user.email)

.form-group
label手机
输入#phone.form-control(type =text,name =phone,value = user.phone)

.form-group
label通讯选项输入/输出
input#newsletter(type =checkbox,name =newsletter,checked =(true === false?checked:undefined) )

if(user.address.length> 0)
for(var i = 0; i< user.shippi ngAddresses.length;我的名字=streetAddress,value = user。 shippingAddresses [i] .streetAddress)

.form-group
标签地址续
输入#address2.form-control(type =text,name =streetAddress2 value = user.shippingAddresses [i] .streetAddress2)

.form-group
标签邮政编码
输入#zip.form-control(type =text,name = zip,value = user.shippingAddresses [i] .zip)
else
.form-group
标签位置昵称
input#address.form-control(type = text,name =nickname,value =)

.form-group
label街道地址
input#address.form-control(type =text NAME =streetAddr ess,value =)

.form-group
label Address Cont。
输入#address2.form-control(type =text,name =streetAddress2,value =)
.form-group
标签状态
输入#state.form -control(type =text,name =state,value =)
.form-group
label邮政编码
输入#zip.form-control(type =text ,name =zip,value =)


按钮(type =submit)更新帐户

另外还有另一个地址,这就是为什么地址是一个数组。



任何方向都是非常有帮助的,因为我可能会随时随地。如果你进一步的代码让我知道。另外要注意的是,我无法从更新功能中获取任何更新的数据,以保存到mongo。



谢谢!

解决方案

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



示例方法:

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


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.

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.

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.

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

这篇关于使用Express和Mongoose将表单数据发布到现有MongoDB文档的数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆