使用 Node、Bodyparser 和 MongoDB 发出请求时 Object.parse 出现语法错误

Syntax error at Object.parse when making a request, using Node, Bodyparser, and MongoDB

在这种情况下,当我尝试使用 postman chrome 插件创建新的 "Flight" 时,出现以下错误:

SyntaxError: Unexpected token d
at Object.parse (native)
at parse (D:\data\coding\nodeprojects\flightlog\fl-server\node_modules\body-parser\lib\types\json.js:84:17)
at D:\data\coding\nodeprojects\flightlog\fl-server\node_modules\body-parser\lib\read.js:102:18
at done (D:\data\coding\nodeprojects\flightlog\fl-server\node_modules\body-parser\node_modules\raw-body\index.js:248:14)
at IncomingMessage.onEnd (D:\data\coding\nodeprojects\flightlog\fl-server\node_modules\body-parser\node_modules\raw-body\index.js:294:7)
at IncomingMessage.g (events.js:199:16)
at IncomingMessage.emit (events.js:104:17)
at _stream_readable.js:908:16
at process._tickCallback (node.js:355:11

猫鼬模型:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var FlightSchema = new Schema({
    created: {
        type: Date,
        default: Date.now
    },
    date: Date,
    registration: String,
    pic: String,
    pnf: String,
    departure: String,
    arrival: String,
    takeOff: String,
    landing: String,
    landingCount: Number,
    remarks: String
});

FlightSchema.statics = {
    load: function (id, cb) {
        this.findOne({
            _id: id
        }).exec(cb);
    }
};

mongoose.model('Flight', FlightSchema);

控制器:

require('../models/flight');
var mongoose = require('mongoose');
var Flight = mongoose.model("Flight");

exports.post = function (req, res) {
    var flight = new Flight(req.body);
    flight.save();
    res.jsonp(flight);
};

exports.get = function (req, res) {
    Flight.find().exec(function (err, flights) {
        res.jsonp(flights)
    });
};

路线:

var express = require('express');
var router = express.Router();

var flightsController = require('../controllers/flightsController');

/* POST /flights */
router.post('/', flightsController.post);

// GET /flights/
router.get('/', flightsController.get);

app.js:

var express = require('express');
var path = require('path');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
//var cors = require('cors');

var users = require('./routes/users');
var flights = require('./routes/flights');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/flightlog');
var db = mongoose.connection;

db.on('error', function callback() {
    console.log("MongoDB connection failed");
});

db.once('open', function callback() {
    console.log("Successfully connected");
});

//app.use(cors());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());

app.use('/users', users);
app.use('/flights', flights);

/// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function (err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function (err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});


module.exports = app;

npm start 可以正常工作,但是一旦我 post 向 postman 发出 请求看起来像:

POST /flights HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Cache-Control: no-cache

{ date: "2015-01-01 14:00", registration: "ABC123", pic: "J. Cash", pnf: "J. Carter", departure: "KJFK", arrival: "KLAX", takeOff: "2015-01-01 14:00", landing: "2015-01-01 14:30", landingCount: 1, remarks: "" }

我收到上面提到的错误 400。有人可以给我提示吗?我迷路了。

您必须更新控制器中的代码

require('../models/flight');
var mongoose = require('mongoose');
var Flight = mongoose.model("Flight");

// in controller post action code is updated ******************* 
exports.post = function (req, res,next) {
    var flight = new Flight(req.body);
    flight.save(function(err, result){

if(!err)
{
res.json(201,result);
}else
{

next(err);
}


});

};

exports.get = function (req, res) {
    Flight.find().exec(function (err, flights) {
        res.jsonp(flights)
    });
};

in postman 如果你提出 post 请求意味着

x-www-form-urlencoded 表示不传递 Content-Type: application/json in header value

如果你想通过原始甲酸盐手段(post man 中的第三个选项卡)

header Content-Type : "application/json"

in raw content 


{
"field":"value"

}

example

{

"firstName":"David",
"lastName":"S"

}

在您的请求中

{ date: "2015-01-01 14:00", registration: "ABC123", pic: "J. Cash", pnf: "J. Carter", departure: "KJFK", arrival: "KLAX", takeOff: "2015-01-01 14:00", landing: "2015-01-01 14:30", landingCount: 1, remarks: "" }

应该是

{ "date": "2015-01-01 14:00", "registration": "ABC123", "pic": "J. Cash", pnf: "J. Carter", "departure": "KJFK", "arrival": "KLAX",.............}

日期应该是json 数据格式