2015-10-05 120 views
0

在我最近瀏覽的時候,我想列出我發佈的事件的ID。但如果它超過五個,那麼我只想要我發佈的最後5個ID。它沒有顯示任何錯誤,但沒有給出任何結果。代碼有什麼問題嗎?爲什麼它沒有顯示輸出?

server.js

var express= require('express'); 
var bodyParser= require('body-parser'); 
var morgan = require('morgan'); 
var config=require('./config'); 
var app= express(); 
var mongoose=require('mongoose'); 
var lodash= require('lodash'); 
var underscore= require('underscore'); 
//var User=require('./database/user') 
mongoose.connect('mongodb://localhost:27017/db',function(err){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     console.log("connected!"); 
    } 
}); 
//res.json({message:"  " }) 
app.use(bodyParser.urlencoded({extended: true })); //if false then parse only strings 
app.use(bodyParser.json()); 
app.use(morgan('dev'));//log all the requests to the console 
var api=require('./app/routes/api')(app,express); 
app.use('/api',api); 
app.get('*',function(req,res){ 
    res.sendFile(__dirname + '/public/views/index.html'); 
}); // * means any route 

app.listen(config.port,function(err){ 
    if(err){ 
     console.log(err); 
    } 
    else{ 
     console.log("The server is running"); 
    } 
}); 

api.js

var User= require('../models/user'); 
var Event=require('../models/event'); 
var config=require('../../config'); 

var secret=config.secretKey; 
module.exports=function(app,express) { 
    var api = express.Router(); 
    // app.use() 

    api.post('/signup', function (req, res) { 
     var user = new User({ 
      name: req.body.name, 
      username: req.body.username, 
      password: req.body.password 

     }); 

     user.save(function (err) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json({ 
       message: 'User created!' 
      }); 
     }); 

    }); 
    api.get('/users', function (req, res) { 
     User.find({}, function (err, users) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json(users); 
     }); 
    }); 
    api.post('/eventfeed', function (req, res) { 
     var event = new Event({ 
      name: req.body.name, 
      location: req.body.location, 
      description: req.body.description, 
      price: req.body.price, 
      rating: req.body.rating 
     }); 

     event.save(function (err) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json({ 
       message: 'Event created!' 
      }); 
     }); 
    }); 
    api.get('/event', function (req, res) { 
     Event.find({}, function (err, event) { 
      if (err) { 
       res.send(err); 
       return; 
      } 
      res.json(event); 
     }); 
    }); 
api.post('/recentlyviewed',function(req,res){ 
     User.findByIdAndUpdate({_id: req.body.userid}, 
      { $push:{"recent": {eventid: req.body.eventid},$each:[],$slice:-5}}, 
      { upsert :true}, 
      function(err,user){ 
       if(err) return err; 
       else 
       res.json(user); 
      }); 
    }); 
    return api; 
} 

這是我的用戶Scehma event.js

var UserSchema = new Schema({ 
    name: String, 
    username: {type: String,required:true,index:{unique:true}}, 
    password: {type:String,required:true,select:false }, 
    favouriteid : [{eventid:String}], 
    recent:[{eventid:String}] 
+0

如果我刪除切片和每個,有一個輸出,但是當我使用此語法時,總是有一個輸出即{}。 – RayOfHope

回答

0

findByIdAndUpdate僅將一個id作爲第一個參數,而不是一個對象。檢查docs你也正在使用$ push和$ each組合,你應該分別提供$ each和$ slice,當它們應該是「最近」對象的一部分時,你推送的對象應該在$每個數組。它應該是

User.findByIdAndUpdate(req.body.id, { 
     $push: { 
      "recent": { 
       $each: [ {eventid: req.body.eventid} ], 
       $slice: -5 
      } 
     } 
    }, 
    { upsert :true},//etc 
+0

啊,功能也被設計爲採取模型對象,所以我認爲是意外之前的問題(沒有在文檔中提到,但它在代碼中)。我發現了切片運算符的錯誤,這解釋了爲什麼刪除它的原因。 – piemonkey

+0

{ 「name」:「MongoError」, 「message」:「cannonicalize query:BadValue unknown top level operator:$ push」, 「$ err」:「Can not canon canonicalize query:BadValue unknown top level運算符:$ push「, 」code「:17287 } – RayOfHope

+0

這是它顯示的錯誤。 – RayOfHope