簡體   English   中英

RESTfull 服務,Post 無法正確保存到 db

[英]RESTfull services, Post cannot save properly to db

RESTfull 服務,Post 無法正確保存到 db

我有 node+express+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 測試我可以獲得所有信息,但是當我嘗試發布類似

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

我回來了 body: {"_id":"5629377429d3c1088c0ebf37","re​​ad":false} 所以從書本模型中只有最后一個參數在正文中,

如果我遺漏了什么,你能不能看看

您可以通過POST方法顯示您在應用程序中收到的內容。 我的意思是:打印變量req.body的內容。 我猜它是空的。

我認為您在從 Postman 撥打電話時錯過了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模塊需要這個提示才能知道如何處理內容。 如果您想支持默認內容類型(我的意思是如果標頭不存在 - 事實上,它應該在那里),您可以添加一個 Express 中間件來設置請求中的內容類型(如果有)。

否則,關於您的代碼的一個小評論。 您可以更新它以利用save方法中的回調:

bookRouter.route('/')
  .post(function(req, res){
    var book = new Book(req.body);

    book.save(function(err, savedBook) {
      res.status(201).send(savedBook);
    });
  })

希望對你有幫助,蒂埃里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM