node.js - 无法发布(评论帖子)| Mongodb 与 Mongoose

标签 node.js mongodb express comments

我正在结合 Mongodb 使用 NodeJS/Express 构建一个应用程序,我希望能够在其中对帖子发表评论,但我一直收到 404 not found。

我在 server.js 中设置了模型和路由,还在两者之间设置了“ref”,但这是我不断收到的响应:

Post Request 正如您在下面看到的,“捕获”又名“发布”确实存在:

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 路由:

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 路由:

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

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

最佳答案

我会使用一个路由脚本,看到您的评论已附加到帖子中。 您还必须将 map 逻辑添加到路由参数中,以用于显示和评论。

尝试以下操作:

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

关于node.js - 无法发布(评论帖子)| Mongodb 与 Mongoose ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37410259/

相关文章:

mongodb 获取分组的最新日期

javascript - Node js mongodb中的增量计数器

node.js - 如何访问 Express 4+ 中每条路线的所有响应时间?

javascript - 如何将 snekfetch 结果放入对象中?

javascript - 在 Node.js 中组织各种请求

mysql - MongoDB 相当于 NOW() + INTERVAL

node.js - 使用多方流调整图像大小

javascript - 在nodejs中关闭浏览器时删除 session

javascript - __dirname 在带有 webpack 捆绑的 Node js 中不起作用

django - 在 Django 中将 JSON 数据从响应传递到请求