Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了node.js – Mongoose – 用于保存带有嵌入文档的模型的表单大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
将嵌入式阵列保存到Mongoose模型时遇到问题.

请参阅底部的编辑.

我有一个表单,使用Mongoose在Express中创建BlogPost,以便在mongo中存储数据.我可以创建和查看新的博客帖子但是我刚刚添加了嵌入式文档架构Feed到BlogPost模型中,我无法将Feed数组从表单保存到模型中

码:

BlogPosts.js

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_database');

var Schema = mongoose.Schema,ObjectId = Schema.ObjectId;

var Feeds = new Schema({
    name      : { type: String },key       : { type: String }
});

var BlogPost = new Schema({
    author    : ObjectId,title     : { type: String,@R_403_1135@: true,index: { unique: true } },date      : { type: Date,default: Date.Now },Feeds     : [Feeds]
});

mongoose.model('BlogPost',BlogPost);

web.js

...
app.get('/blogpost/new',function(req,res) {
    res.render('blogposts/blogpost_new.jade',{ locals: {
        title: 'New BlogPost'
    }
    });
});

app.post('/blogpost/new',res){
    var b = new BlogPost(req.body.b)
    b.save(function() {
      b.Feeds.push();
      res.redirect('/blogposts');
    });
});
...
var BlogPost = mongoose.model('BlogPost',BlogPost);

玉形

form( method="post")
  div
    div
      span Title :
      input(type="text",name="b[title]",id="editBlogPostTitle")
    div 
      span Feeds :
      ul 
        li 
          span name
          textarea( name="f[name]",rows=20,id="editBlogPostBodyName")
        li
          span key
          textarea( name="f[key]",id="editBlogPostBodyKey")
    div#editBlogPostSubmit
      input(type="submit",value="Send")

如果我填写此表单,模型会发布并保存,但Feed数据不存在(“Feeds”:[]).

我应该如何正确提交Feed数据以保存到阵列?

编辑

所以我设法在BlogPost中设置一个表格来保存带有名称和密钥的Feed对象,执行以下操作.但是,仍需要对此进行改进,以便在创建单个BlogPost时保存多个Feeds.使用我目前的解决方案,我只能正确保存一个Feed.思考?

blogposts.js(只需将Feed更改为Feed

var Feed = new Schema({
...

web.js(刚推动推送)

app.post('/blogpost/new',res){
    var b = new BlogPost(req.body.b)
    b.Feeds.push(req.body.Feed);
    b.save(function() {
      res.redirect('/blogposts');
});

});

表单(只需更改提要名称)

li
        span name
        textarea( name="Feed[name]",id="editBlogPostBodyKey")
    li
        span key
        textarea( name="Feed[key]",id="editBlogPostBodyKey")

这样可以节省,我只是在保存时无法在博客中创建多个Feed.任何帮助非常感谢.谢谢.

解决方法

对于路线:

你不需要做b.Feeds.push();在邮政方面.我在创建一个新对象时有一个推动力,但只是因为我希望至少有一个嵌套模型.然后,看看你如何有一个列表,你可能想要添加b.Feeds.push();在另一方面.

对于视图,您需要保持模型完整.

假设b是blogpost并且它是f列表的父级,那么你需要:

span Feeds :
  - var i = 0;
  ul
  - each Feed in blogPost.Feeds
    li 
      span name
      textarea( name="blogPost[Feeds][i][name]",id="editBlogPostBodyName")=Feed.name
    li
      span key
      textarea( name="blogPost[Feeds][i][key]",id="editBlogPostBodyKey")=Feed.key
    - i++

routes.js(或routes / blogPosts.js):

app.get('/blogpost/new',res) {
    post = new BlogPost();
    post.Feeds.push(new Feed());
    res.render('blogposts/blogpost_new.jade',{ locals: {
        title: 'New BlogPost',blogPost: post
    }
    });
});

编辑我将b更改为blogPost,将f更改为视图.还在路由定义中添加了“新”逻辑.

另外,请注意,在这种情况下,任何路线都不可编辑.从理论上讲,它应该在编辑它们时删除并保存任何新的提要(如果你要进行更新操作).如果您希望它们是可以编辑的独立实体,那么您需要提供它们并添加一种通过id获取它们的方法.我认为mongoosejs.com上概述了这种方法.

大佬总结

以上是大佬教程为你收集整理的node.js – Mongoose – 用于保存带有嵌入文档的模型的表单全部内容,希望文章能够帮你解决node.js – Mongoose – 用于保存带有嵌入文档的模型的表单所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: