无法发帖(评论帖子)| Mongodb与猫鼬

时间:2016-05-24 09:59:22

标签: node.js mongodb express commenting

我在NodeJS / Express中构建了一个与Mongodb相结合的应用程序,我希望能够对帖子发表评论,但我一直找不到404。

我在server.js中设置了模型和路线,并设置了' ref'两者之间,但这是我一直得到的回应:

Post Request 正如您可以通过以下方式看到的,'捕获' aka' post'确实存在:

capture

编辑:使用Zen给我的答案对我的初始代码进行了一些更改。

这是我的代码:

-server.js

// Init Express Web Framework
var express = require('express');
var app = express();
var path = require('path');


// Set view engine to EJS & set views directory
app.engine('html', require('ejs').renderFile);
app.set('view engine', 'html');
app.set('views', path.resolve(__dirname, 'client', 'views'));

app.use(express.static(path.resolve(__dirname, 'client')));

// Database Connection
var mongoose = require('mongoose');
var configDB = require('./server/config/database.js');
require('./server/routes/capture');
require('./server/routes/comment');
mongoose.connect(configDB.url);

var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));               
app.use(bodyParser.text());                                    
app.use(bodyParser.json({ type: 'application/json'}));  

// Main route
app.get('/', function(req, res){
    res.render('index.html');
});
// API 
var api = express.Router();
require('./server/routes/capture')(api);
require('./server/routes/comment')(api);
app.use('/api', api);

// Port Settings
app.listen(process.env.PORT || 3000, process.env.IP);
console.log('Listening on port ' + process.env.PORT);

-capture.js型号:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var captureSchema = Schema({
    birdname: {type: String, required: true},
    place: String,
    userId: String,
    author: String,
    picture: Schema.Types.Mixed,
    created_at: Date,
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment'}]
});

module.exports = mongoose.model('Capture', captureSchema);

-capture.js route:

var Capture = require('../models/capture');

module.exports = function(router) {
    router.post('/captures', function(req, res){
        var capture = new Capture();
        capture.birdname = req.body.birdname;
        capture.place =  req.body.place;
        capture.userId = req.body.userId;
        capture.author = req.body.author;
        capture.picture = req.body.picture;
        capture.created_at = new Date();


        capture.save(function(err, data){
            if(err)
                throw err;
            console.log(req.body);
            res.json(data);
        });
    });

    router.get('/captures', function(req, res){
        Capture.find({}, function(err, data){
            if(err)
                throw err;
            res.json(data);
        });
    });

     router.delete('/captures', function(req, res){
          Capture.remove({}, function(err){
              res.json({result: err ? 'error' : 'ok'});
          });
      });

    router.get('/captures/:id', function(req, res){
         Capture.findOne({_id: req.params.id}, function(err, data){
             if(err)
                throw err;
             res.json(data);
         });
     });

     router.delete('/captures/:id', function(req, res){
         Capture.remove({_id: req.params.id}, function(err){
             res.json({result: err ? 'error' : 'ok'});
         });
     });
};

-capture.js型号:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var commentSchema = Schema({
    birdname: String,
    body: {type: String, required: true},
    userId: {type: String, required: true},
    author: {type: String, required: true},
    created_at: Date,
    capture: [{ type: Schema.Types.ObjectId, ref: 'Capture'}]
});

module.exports = mongoose.model('Comment', commentSchema);

-comment.js route:

var Comment = require('../models/comment');

module.exports = function(router) {
    router.post('/captures/:capture/comments', function(req, res, next){
        var comment = new Comment();
        comment.birdname = req.body.birdname;
        comment.body =  req.body.body;
        comment.userId = req.body.userId;
        comment.author = req.body.author;
        comment.created_at = new Date();
        comment.capture = capture;

        comment.save(function(err, comment) {
            if (err) { return next(err); }

            req.capture.comments.push(comment);
            req.capture.save(function(err, capture) {
                if (err) { return next(err); }

                res.json(comment);
            });
        });
    });
};

非常感谢任何帮助.. 感谢

2 个答案:

答案 0 :(得分:1)

我会使用一个路线脚本,看到你的评论附在帖子上。 您还必须在路径参数中添加Map逻辑以进行cature和comment。

尝试以下方法:

var Capture = require('../models/capture');
var Comment = require('../models/comment');

module.exports = function(router) {
    router.post('/captures', function(req, res){
        var capture = new Capture();
        capture.birdname = req.body.birdname;
        capture.place =  req.body.place;
        capture.userId = req.body.userId;
        capture.author = req.body.author;
        capture.picture = req.body.picture;
        capture.created_at = new Date();


        capture.save(function(err, data){
            if(err)
                throw err;
            console.log(req.body);
            res.json(data);
        });
    });

    router.get('/captures', function(req, res){
        Capture.find({}, function(err, data){
            if(err)
                throw err;
            res.json(data);
        });
    });

     router.delete('/captures', function(req, res){
          Capture.remove({}, function(err){
              res.json({result: err ? 'error' : 'ok'});
          });
      });

    // Map logic to route parameter 'capture'
    router.param('capture', function(req, res, next, id) {
        var query = Capture.findById(id);

        query.exec(function (err, capture) {
            if (err) { return next(err); }
            if (!capture) { return next(new Error("can't find post")); }

            req.capture = capture;
            return next();
        });
    });
    // Map logic to route parameter 'comment'
    router.param('comment', function (req, res, next, id) {
        var query = Comment.findById(id);

        query.exec(function (err, comment) {
            if (err) { return next(err); }
            if (!comment) { return next(new Error("can't find comment")); }

            req.comment = comment;
            return next();
        });
    });  

    router.get('/captures/:id', function(req, res){
         Capture.findOne({_id: req.params.id}, function(err, data){
             if(err)
                throw err;
             res.json(data);
         });
     });

     router.delete('/captures/:id', function(req, res){
         Capture.remove({_id: req.params.id}, function(err){
             res.json({result: err ? 'error' : 'ok'});
         });
     });

    router.post('/captures/:capture/comments', function(req, res, next){
        var comment = new Comment();
        comment.birdname = req.body.birdname;
        comment.body =  req.body.body;
        comment.userId = req.body.userId;
        comment.author = req.body.author;
        comment.created_at = new Date();
        comment.capture = req.capture;

        comment.save(function(err, comment) {
            if (err) { return next(err); }

            req.capture.comments.push(comment);
            req.capture.save(function(err, capture) {
                if (err) { return next(err); }

                res.json(comment);
            });
        });
    });
};

答案 1 :(得分:0)

状态代码为404.显然,找不到相应的路由器。问题是您在comment.js route中导出“init”函数。当您需要server.js中的评论路由器时,没有任何反应。

// API 
var api = express.Router();
require('./server/routes/capture')(api);
// you have forgotten it
require('./server/routes/comment')(api);
app.use('/api', api);

顺便说一句,当您发布到capture时,无需将req.body放入'/captures/:capture/comments',因为您可以使用:capture获取const capture = req.params.capture;