TypeError:[function name]不是mongoose和node.js中的函数

时间:2016-02-13 01:58:07

标签: javascript node.js mongodb mongoose

我是node.js和mongoose的新手,如果有人可以帮助我解决以下错误,我会很感激。

我通过以下函数发出一个put请求(该函数的目的是“upvote”一个论坛帖子。

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

这又转到了我的路线:

index.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不是函数

1 个答案:

答案 0 :(得分:2)

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);
    });
  });
});

编辑:您还需要在中设置方法,然后在mongoose中创建架构:

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

mongoose.model('Post', PostSchema);