2015-02-05 29 views
0

我试图根据视图中的一个模式属性的参数请求来循环我的数据库集合。我的模式中有一个tags属性,保存为数组。我希望能够做的是点击保存到该数组的值中的一个值,该值将呈现包含所选标签值的集合的页面。我已经能够创建路线,该路线将指引我点击的单个标签,但是我收到tags: [xxx, xxx, xxx] has no method .forEach。当我在我的视图中呼叫我的循环时会发生这种情况。为什么会这样,我该如何解决这个问题?Expressjs基于参数检索集合

错误消息:

TypeError: /Users/user/Desktop/Projects/node/blog/views/pages/tag.ejs:15 
    13| <div class="col-md-12"> 
    14| <h1><%= blogpost.tags %></h1> 
>> 15| <% blogpost.forEach(function(blogpost) { %> 
    16| <%= blogpost.title %> 
    17| <% }); %> 
    18| </div> 

Object { _id: 54c7bd20c58f389232000001, 
category: 'Analytics/SEO/SEM', 
content: '', 
tagline: 'yep', 
author: 'Author', 
blogUrl: 'roger', 
featureImage: '/images/event-placeholder.png', 
title: 'Roger', 
__v: 0, 
date: Tue Jan 27 2015 11:29:48 GMT-0500 (EST), 
tags: [ 'wolf', ' cow', ' monkey' ] } has no method 'forEach' 

这里是我的模型:

var mongoose = require('mongoose'); 
var mongoosePaginate = require('mongoose-paginate'); 
var Schema  = mongoose.Schema; 



var BlogPostSchema = new Schema({ 
     title: { type: String, unique: true }, 
     featureImage: String, 
     blogUrl: String, 
     author: String, 
     tagline: String, 
     category: String, 
     content: String, 
     tags: { type: Array, lowercase: true }, 
     date: { type: Date, default: Date.now() } 
}); 

BlogPostSchema.post('init', function (post) { 
    var date = new Date(post.date || Date.now()); 
    post.dateString = date.getMonth() + 1 + '/' + date.getDate() + '/' + date.getFullYear(); 

}); 

BlogPostSchema.plugin(mongoosePaginate); 

var Blogpost = mongoose.model("Blogpost", BlogPostSchema); 



module.exports = mongoose.model('Blogpost', BlogPostSchema); 

这里是我如何我的路线内叫我单独选择标签(难道我的函数使用正确的参数调用方法?):

router.route('/admin/posts/create') 

    // START POST method 
     .post(function(req, res) { 

      console.log("New instance"); 
      console.log(req.body.tags); 

      var blogpost = new Blogpost(); // create a new instance of a Blogpost model 

      blogpost.title = req.body.title; // set the blog title 
      blogpost.featureImage = req.body.featureImage; // set the blog image 
      blogpost.blogUrl = blogpost.title.toLowerCase().replace(/\s+/g,"-"); 
      blogpost.author = req.body.author; // set the author name 
      blogpost.tagline = req.body.tagline; // set the tagline 
      blogpost.content = req.body.content; // set the blog content 
      blogpost.category = req.body.category; // set the category 
      blogpost.tags = req.body.tags.trim().split(","); // set the tags 
       //Save Blog Post 
       blogpost.save(function(err) { 
        if (err) 
         res.send(err); 

        res.redirect(303, '/'); //NEEDS TO BE CHANGED 
       }); 

     }) // END POST method 


     .get(isLoggedIn, function(req, res, blogpost) { 
      res.render('pages/blogpost-create', { 
       blogpost : blogpost 
      }); 
     }); 

function getTagCriteria(params){ 
    return { 
    tags: params.blogpost_tags 
    }; 
} 

router.route('/tag/:blogpost_tags') 

    .get(function (req, res) { 
     var tagCriteria = getTagCriteria(req.params); 
     Blogpost.findOne(tagCriteria, function (err, blogpost) { 
     if (err) 
      res.sent(err); 
     res.render('pages/tag', { 
      blogpost : blogpost 
     }) 
     }) 
    }); 

页/标签视图文件:

<div class="container"> 
     <div class="col-md-12"> 
      <h1><%= blogpost.tags %></h1> 
      <% blogpost.forEach(function(blogpost) { %> 
       <%= blogpost.title %> 
      <% }); %> 
     </div> 
    </div> 

回答

0

您蒙戈查询更改为:

Blogpost.find(tagCriteria, function (err, blogpost) { 
    if (err) 
     res.sent(err); 
    res.render('pages/tag', { 
     blogpost : blogpost 
    }) 
    }) 

注:博文现在是[]数组,而不是一个对象{}

然后在你的玉器,请执行下列操作

<% blogpost.forEach(function(post) { %> 
    <%= post.title %> 
<% }); %> 
+0

所以我只是试图调用与页面上显示的标签值相同的所有标题。如果我点击标有'wolf'的帖子的标签,我希望看到一个页面显示标签值为'wolf'的帖子的所有标题。我将'.forEach'方法改为循环,但现在我只得到一个帖子,而不是包含该标签的所有帖子。对于 '<%(VAR I = 0; I <%= blogpost.title[i] %> <% } %> '上为什么可能是任何想法? – cphill

+0

那么,第一个问题是你的mongo查询调用findOne(),它返回一个文档。改变你的查询使用.find()方法:Blogpost.find(tagCriteria, –

+0

)你的第二个问题是,你的循环标准是blogpost.title.length。标题是一个字符串,所以你的循环遍历整个长度你的标题,这是没有道理的。当你改变findOne find(),“blogpost”将成为一个数组,所以你可以使用foreach循环。 –