使用Express和Mongoose将表单数据发布到现有MongoDB文档的数组 [英] Post Form Data to Array of Existing MongoDB Document using Express and Mongoose
问题描述
我正在尝试创建一个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屋!