2016-02-13 42 views
1

我是新來的node.js和mongoose,如果有人可以幫我解決下面的錯誤,我會很感激。TypeError:[function name]不是函數,在mongoose和node.js中

我讓通過以下功能(該功能的點PUT請求是「給予好評」的論壇帖子

o.upvote = function(post) { 
    return $http.put('/posts/' + post._id + '/upvote') 
     .success(function(data){ 
      post.upvotes += 1; 
     }); 
}; 

這反過來又轉到我的路線:

指數。 JS(我的路線)

router.put('/posts/:post/upvote', function(req, res, next) { 
    req.post.upvote(function(err, post){ 
     if (err) { return next(err); } 

     res.json(post); 
    }); 
}); 

而且下面是我的模型

Posts.js

var mongoose = require('mongoose'); 

var PostSchema = new mongoose.Schema({ 
    title: String, 
    link: String, 
    upvotes: {type: Number, default: 0}, 
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }] 
}); 

mongoose.model('Post', PostSchema); 

PostSchema.methods.upvote = function(cb) { 
    this.upvotes += 1; 
    this.save(cb); 
}; 

在我index.js路線,下面的錯誤被拋出就行了 「req.post.upvote」:

TypeError: req.post.upvote is not a function

+0

什麼是'req.post'應該是什麼? –

回答

1

req.post不會被自動設置。你需要另一箇中間件來設置它,但很可能你想用參數從DB中獲取它。

const Post = mongoose.model("Post"); 

router.put("/posts/:post/upvote", (req, res, next) => { 
    Post.findById(req.params.post, (err, post) => { 
    if (err) return next(err); 
    post.upvote((err, post) => { 
     if (err) return next(err); 
     res.json(post); 
    }); 
    }); 
}); 

編輯:您還需要設置你創建貓鼬架構之前方法:

PostSchema.methods.upvote = function(cb) { 
    this.upvotes += 1; 
    this.save(cb); 
}; 

mongoose.model('Post', PostSchema); 
+0

我已經在代碼中定義了一個名爲「post」的參數,(對不起,我沒有在我的原始文章中包含它)。但是當我調試時,我能夠正確地看到「發佈」對象。問題是我想調用我的模型中定義的「upvote」函數,但我似乎無法做到這一點。謝謝 – Flame1845

+1

@ Flame1845可能會嘗試移動'mongoose.schema'調用_after_你設置'.methods' –

+0

你的傳說,修復它......非常感謝!我不知道我必須這樣做......我將銘記未來! – Flame1845