使用POST方法

时间:2017-03-08 20:31:36

标签: javascript node.js express

我真的很擅长使用REST和Express,而且我已经在REST API上关注了这个 tutorial 。这是我的 app.js 代码:

var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require("mongoose");

var app = express();
var port    = parseInt(process.env.PORT, 10) || 3000;

app.use(bodyParser.urlencoded({ extended: true}));
app.use(bodyParser.json());

Genre = require('./models/genre');

//Connect to mongoose
mongoose.connect('mongodb://localhost/bookstore');

var db = mongoose.connection;

app.listen(port);
console.log('Running on port 3000\n\n');

app.post('/api/genres', function(req, res){
        console.log(req.body);
        var genre = req.body;
        Genre.addGenre(genre, function(err, genre){
            if (err) {
                console.log(err);
                res.send({status: 'something went wrong'});
            }else{
            res.send({status: 'saved'});
            res.json(genre);}
        });
}); 

我在Firefox上使用Rest Easy检查POST请求。生成的错误是"类型验证失败"因为身体是空的。用于此的模式在模型中定义为:

var mongoose = require("mongoose");

//Genre Schema
var genreSchema = new mongoose.Schema({

    name: {
        type: String,
        required: true
    },
    create_data:{
        type: Date,
        default: Date.now
    }
});

var Genre = module.exports = mongoose.model('Genre', genreSchema);

// add genre
module.exports.addGenre = function(genre, callback){
    Genre.create(genre, callback);
};

我已经尝试了其他几个流行的帖子,但它仍然没有解决问题。我已经尝试重新排列模块的导入顺序,并使用' application / x-www-form-urlencoded'将数据作为表单输入。任何的想法?

编辑:输出console.log(req.body):

{}

在jsfiddle.net上,console.log(req)的输出位于 jbkb1yxa 。(StackOverflow不会让我嵌入更多链接,因为我的声望点很低,道歉。) REST easy的屏幕截图: http://imgur.com/6QmQqRV

4 个答案:

答案 0 :(得分:0)

您需要在REST Easy端的数据部分输入正确的MIME类型:

application/json

答案 1 :(得分:0)

可能是因为您对数据库的调用找不到您要查找的内容。当我第一次开始学习Mongoose时,对我来说,一个巨大的痛点是,我错误地认为空的回答被算作err,但事实并非如此。

如果您将console.log(genre)置于res.sendres.json语句之上,会记录什么内容?

另外,只是想知道,为什么使用res.send后跟res.json

答案 2 :(得分:0)

确定。所以我想这可能是一个扩展问题。我使用相同的代码在chrome中使用POSTMAN发送POST请求,现在它正常工作。早些时候甚至Postman没有工作,但在我配置chrome不使用代理服务器之后,它工作得很好。

感谢大家帮助我。

答案 3 :(得分:0)

在Postman的3个可用于内容类型的选项中,选择“X-www-form-urlencoded”,它应该有效。

app.use(bodyParser.urlencoded({
  extended: true
}));

请参阅https://github.com/expressjs/body-parser

'body-parser'中间件只处理JSON和urlencoded数据

在Postman中,要使用原始JSON数据有效负载测试HTTP post操作,请选择raw选项并设置以下标头参数:

Content-Type: application/json

另外,请务必用双引号将JSON有效内容中用作键/值的任何字符串换行。

body-parser包将解析多行原始JSON有效负载。

{
    "foo": "bar"
}