2014-10-20 42 views
0

我正在尝试对我的日期模型属性使用mongoose findOne方法,以仅使用最新文档中的数据。我正在使用EJS模板系统,并试图用我的视图使用此方法,但收到一个错误,event.findOne`线。我应该如何使用这种方法?应该在routes.js中调用吗?试图在EJS上使用FindOne Mongoose方法

eventsModel.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

var EventSchema = new Schema({ 
    name: String, 
    title: String, 
    company: String, 
    url: String, 
    date: { type: Date, default: Date.now }, 
    upcomingEvent: { type: Boolean, default: false } 

}); 

module.exports = mongoose.model('Event', EventSchema); 

routes.js

var express = require('express'); 
var router = express.Router(); 
var Event = require('./models/eventsModel'); 



//GET '/' 
router.get('/', function(req, res){ 
    res.render('pages/index.ejs'); 
}); 

//GET '/about' 
router.get('/about', function(req, res){ 
    res.render('pages/about.ejs'); 
}); 



//GET '/media' 
router.get('/media', function(req, res){ 
    res.render('pages/media.ejs'); 
}); 

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

    .post(function(req, res){ 

     var events = new Event(); 

     events.name = req.body.name; 
     events.title = req.body.title; 
     events.company = req.body.company; 
     events.url = req.body.url; 
     events.upcomingEvent = req.body.upcomingEvent; 

     events.save(function(err){ 
      if (err) 
       res.send(err); 

      res.redirect(303, '/events'); 

     }); 
    }) 

    .get(function(req, res){ 
     Event.find(function(err, events){ 
      if (err) 
       res.send(err); 

      res.render('pages/events-create.ejs'); 
     }); 
    }); 

router.route('/admin/events/:events_id') 

    .get(function(req, res){ 
     Event.findById(req.params.events_id, function(err, events){ 
      if (err) 
       res.send(err); 

      res.json(events); 
     }); 
    }) 

    .put(function(req, res){ 

     Event.findById(req.params.events_id, function(err, events){ 
      if (err) 
       res.send(err); 

      res.json({ message: 'Event Updated'}); 
     }); 
    }); 

//GET '/events' 
router.get('/events', function(req, res){ 

    Event.find(function(err, events){ 
     if (err) 
      res.send(err); 

     events.name = req.body.name; 
     events.title = req.body.title; 
     events.company = req.body.company; 
     events.url = req.body.url; 
     events.upcomingEvent = req.body.upcomingEvent; 

     res.render('pages/events.ejs', { 
      events : events 
     }); 
    }); 
}); 

module.exports = router; //export all objects in router module 

events.ejs

<!DOCTYPE HTML> 
<html> 
<head> 
    <% include ../partials/head %> 
</head> 

<body> 
    <% include ../partials/navigation %> 

    <div class="grid" id="lvc-events-title-container"> 
     <div class="col-1-1"> 
      <div id="events-heading"> 
       <h1><i>-EVENTS</i></h1> 
      </div> 
     </div> 
    </div> 

    <div class="grid" id="lvc-current-event-container"> 
     <div class="col-1-1"> 
      <div id="current-event"> 
       <% events.findOne({'events.date': -1}, function(events) { %> 
       <h2><i>-UPCOMING SPEAKER</i></h2> 
       <div id="current-event-image"> 
        <img src="http://placehold.it/140x100" id="speaker-image"> 
        <h3>John Doe</h3> 
        <p>Title</p> 
        <p>Company</p> 

        <% }); %> 
       </div> 
      </div> 
     </div> 
    </div> 


    <div class="grid" id="lvc-past-events-container"> 
     <div class="col-1-1"> 
      <div id="past-speakers"> 
      <h2><i>-PAST SPEAKERS</i></h2> 
      <% events.forEach(function(events) { %> 
      <ul> 
       <li><a href="<%= events.url %>"><%= events.name %></a> (<%= events.title %> | <%= events.company %>)</li> 
      </ul> 
      <% }); %> 
      </div> 
     </div> 
    </div> 

</body> 
</html> 
+0

据我可以看到'events'在视图中被包裹对象阵列。它是javascript数组,你可以使用'filter'而不是'findOne' – Mirodil 2014-10-20 13:54:04

回答

0

好,一些小的距离我可以告诉weridnesses ...

  1. 从视图查询是不是一个好主意。您应该在您的“控制器”或路线中执行查询。
  2. 方法findOne是模型上的static方法(如发现即Event.find),在原稿不是instance方法(如保存即event.save
  3. 阵列上您设置属性从find方法返回
  4. 你只需要订购查询; d

路由器:

router.get('/events', function(req, res) { 
    Event.find({}) 
     .sort({'date': -1}) 
     .exec(function(err, events) { 
     if (err) 
      res.send(err); 

     // Events is an array of event models, so this is setting properties on an array 
     // It also doesn't look like you are using it in your view so its not needed 
     //events.name = req.body.name; 
     //events.title = req.body.title; 
     //events.company = req.body.company; 
     //events.url = req.body.url; 
     //events.upcomingEvent = req.body.upcomingEvent; 


     // The events local in your page will be an array with index[0] being the most recent event, which I believe is your 'UPCOMING SPEAKER'. You can then loop over the rest of the array from 1. 
     res.render('pages/events.ejs', { 
      events : events 
     }); 
    }); 
}); 

查看

<div class="grid" id="lvc-current-event-container"> 
    <div class="col-1-1"> 
     <div id="current-event"> 
      <h2><i>-UPCOMING SPEAKER</i></h2> 
      <div id="current-event-image"> 
       <img src="http://placehold.it/140x100" id="speaker-image"> 
       <h3><%= events[0].name %></h3> 
       <p><%= events[0].title %></p> 
       <p><%= events[0].compant %></p> 
      </div> 
     </div> 
    </div> 
</div> 

...

<div class="grid" id="lvc-past-events-container"> 
    <div class="col-1-1"> 
     <div id="past-speakers"> 
     <h2><i>-PAST SPEAKERS</i></h2> 
     <% for (var i = 1; i < events.length; i++) { %> 
     <ul> 
      <li><a href="<%= events[i].url %>"><%= events[i].name %></a> (<%= events[i].title %> | <%= events[i].company %>)</li> 
     </ul> 
     <% }; %> 
     </div> 
    </div> 
</div> 
+0

非常感谢你@moonthug!这工作。 – cphill 2014-10-22 01:37:30

0

我没有用猫鼬很广泛,但是当你通过“事件'数组到你的模板,你已经隐式地传递了最新的事件(加上以前的事件) - 这意味着你只需要mas将数据一点一点地以所需的方式显示出来。注意:all方法可能会更好,因为它看起来并不像对事件进行任何过滤。

此代码可能无法正常工作,并且假设events数组中的数据按日期排序(如同伪代码一样对待),但它应该将您设置在正确的轨道上。

<!DOCTYPE HTML> 
<html> 
<head> 
    <% include ../partials/head %> 
</head> 

<body> 
    <% include ../partials/navigation %> 

<div class="grid" id="lvc-events-title-container"> 
    <div class="col-1-1"> 
     <div id="events-heading"> 
      <h1><i>-EVENTS</i></h1> 
     </div> 
    </div> 
</div> 

<div class="grid" id="lvc-current-event-container"> 
    <div class="col-1-1"> 
     <div id="current-event"> 
      <h2><i>-UPCOMING SPEAKER</i></h2> 
      <div id="current-event-image"> 
       <img src="http://placehold.it/140x100" id="speaker-image"> 
       <h3><%= events[0].name %></h3> 
       <p><%= events[0].title %></p> 
       <p><%= events[0].company %></p> 
      </div> 
     </div> 
    </div> 
</div> 


<div class="grid" id="lvc-past-events-container"> 
    <div class="col-1-1"> 
     <div id="past-speakers"> 
     <h2><i>-PAST SPEAKERS</i></h2> 
     <% for (var i = 1; i < events.length; i++) { %> 
     <ul> 
      <li><a href="<%= events[i].url %>"><%= events[i].name %></a> (<%= events[i].title %> | <%= events[i].company %>)</li> 
     </ul> 
     <% }; %> 
     </div> 
    </div> 
</div> 

相关问题