REST满服务,Post不能正确保存到数据库

REST满服务,Post不能正确保存到数据库

我有节点+快递+mongoose我的模特:

var mongoose = require('mongoose'), Schema = mongoose.Schema; var bookModel = new Schema({ title: { type: String }, author: { type: String }, genre: { type: String }, read:{ type: Boolean, default:false } }); module.exports = mongoose.model('Book', bookModel); 

我的App.js

 var express = require('express'), mongoose = require('mongoose'), bodyParser = require('body-parser'); var db = mongoose.connect('mongodb://localhost/bookApi'); var Book = require('./models/bookModel'); console.log(Book); var app = express(); var port = process.env.PORT || 3000; app.use(bodyParser.urlencoded({extended:true})); app.use(bodyParser.json()); bookRouter = require('./Routes/bookRoutes')(Book); app.use('/api/books', bookRouter); /*app.use('/api/authors', authorRouter);*/ app.get('/', function (req, res) { res.send('welcome to my API!'); }); app.listen(port, function () { console.log('Gulp running on Port: ' + port); }); 

我的路线:

 var express = require('express'); var routes = function(Book){ var bookRouter = express.Router(); bookRouter.route('/') .post(function(req, res){ var book = new Book(req.body); book.save(); res.status(201).send(book); }) .get(function (req, res) { var query = {}; if(req.query.genre){ query.genre = req.query.genre; } Book.find(query, function (err, books) { if(err) res.status(500).send(err); else res.json(books); }); }); bookRouter.route('/:bookId') .get(function (req, res) { Book.findById(req.params.bookId, function (err, book) { if(err) res.status(500).send(err); else res.json(book); }); }) .put(function (req, res){ Book.findById(req.params.bookId, function (err, book) { if(err) res.status(500).send(err); else book.title = req.body.title; book.author = req.body.author; book.genre = req.body.genre; book.read = req.body.read; book.save(); res.json(book); }); }); return bookRouter; }; module.exports = routes; 

我使用Postmant来testing我可以得到所有的信息,但是当我试图发布类似的东西

 {"title":"WAR","genre":"Sience Fiction","author":"Wells","read":false} 

我回来的身体:{“_id”:“5629377429d3c1088c0ebf37”,“读”:false}所以从书模型只有最后一个参数在身体,

如果我错过了一些东西,你可以看看吗?

您可以在POST方法中显示您在应用程序中收到的内容。 我的意思是:打印variablesreq.body的内容。 我猜这是空的。

我觉得当你从邮递员来电时,你会错过Content-Type标题。 我没有标题复制你的问题,它与标题。 这是我用来使你的代码工作的要求:

 POST /api/books/ HTTP/1.1 Content-Type: application/json {"title":"WAR","genre":"Sience Fiction","author":"Wells","read":false} 

和相应的回应:

 HTTP/1.1 201 Created X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 111 ETag: W/"6f-25V+nQZe0YZPysuvDsoa5Q" Date: Fri, 23 Oct 2015 07:34:43 GMT Connection: keep-alive {"__v":0,"title":"WAR","genre":"Sience Fiction","author":"Wells","_id":"5629e313074a746934d55f40","read":false} 

实际上, body-parser模块需要这个提示来知道如何处理内容。 如果你想支持默认的内容types(我的意思是如果头不存在 – 实际上它应该在那里),你可以添加一个Express中间件来设置请求中的内容types(如果有的话)。

否则,关于你的代码的一个小小的评论。 您可以更新它以利用save方法中的callback:

 bookRouter.route('/') .post(function(req, res){ var book = new Book(req.body); book.save(function(err, savedBook) { res.status(201).send(savedBook); }); }) 

希望它能帮助你,Thierry