不能张贴(评论一个post)| 蒙哥与mongoose

我在NodeJS / Express与Mongodb结合创build应用程序,在那里我想能够发表评论,但我一直没有find404。

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

发布请求 正如你可以看到以下,“捕获”又名“后”确实存在:

捕获

编辑:用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); }); }); }); }; 

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

我会使用一个路由脚本,看到你的评论被附加到post。 你还必须添加一个地图逻辑的路线参数为熟悉和评论。

尝试以下操作:

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

状态码是404.显然,没有find相应的路由器。 问题是你在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); 

顺便说一句,在发布到'/captures/:capture/comments' req.body '/captures/:capture/comments' ,不需要将capturereq.body ,因为您可以通过使用const capture = req.params.capture;获取:capture const capture = req.params.capture;