2015-02-05 60 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循環。 –