Javascript 使用POST方法时Node.js req.body为空

Javascript 使用POST方法时Node.js req.body为空,javascript,node.js,express,Javascript,Node.js,Express,我对使用REST和Express非常陌生,我一直在关注RESTAPI。这是我的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(bodyP

我对使用REST和Express非常陌生,我一直在关注RESTAPI。这是我的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上使用RESTEasy来检查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)的输出位于jsfiddle.net上的jbkb1yxa(StackOverflow不允许我嵌入更多链接,因为我的信誉度很低,抱歉。) REST easy的屏幕截图:

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

application/json

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

application/json

这可能是因为您对数据库的调用没有找到您要查找的内容。当我第一次开始学习猫鼬时,一个巨大的痛点是我错误地期望一个空响应被算作
err
,但事实并非如此

如果在
res.send
res.json
语句上方放置
console.log(genre)
,会记录什么


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

这可能是因为您对数据库的调用没有找到您要查找的内容。当我第一次开始学习猫鼬时,一个巨大的痛点是我错误地期望一个空响应被算作
err
,但事实并非如此

如果在
res.send
res.json
语句上方放置
console.log(genre)
,会记录什么


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

Ok。所以我想这可能是一个扩展问题。我使用相同的代码在chrome中使用POSTMAN发送POST请求,现在它工作正常。早些时候,即使是邮递员也不工作,但在我将chrome配置为不使用代理服务器之后,它工作得很好


谢谢大家帮助我。

好的。所以我想这可能是一个扩展问题。我使用相同的代码在chrome中使用POSTMAN发送POST请求,现在它工作正常。早些时候,即使是邮递员也不工作,但在我将chrome配置为不使用代理服务器之后,它工作得很好


谢谢大家的帮助。

在内容类型可用的3个选项中的Postman中选择“X-www-form-urlencoded”,它应该可以工作

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

“主体解析器”中间件仅处理JSON和urlencoded数据

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

Content-Type: application/json
另外,请确保将JSON负载中用作键/值的任何字符串用双引号括起来

body parser包可以很好地解析多行原始JSON有效负载

{
    "foo": "bar"
}

在内容类型可用的3个选项中的Postman中,选择“X-www-form-urlencoded”,它应该可以工作

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

“主体解析器”中间件仅处理JSON和urlencoded数据

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

Content-Type: application/json
另外,请确保将JSON负载中用作键/值的任何字符串用双引号括起来

body parser包可以很好地解析多行原始JSON有效负载

{
    "foo": "bar"
}

显示console.log(req)和console.log(req.body)的结果。您可能以错误的格式传递POST请求。确保请求主体是JSON。您可以添加传递参数方式的图像。POST请求是如何发出的?可能是您向api发出POST请求的方式,然后是其他方式。这是否回答了您的问题?显示console.log(req)和console.log(req.body)的结果。您可能以错误的格式传递POST请求。确保请求主体是JSON。您可以添加传递参数方式的图像。POST请求是如何发出的?可能是您向api发出POST请求的方式,然后是其他方式。这是否回答了您的问题?else语句不执行。它保留在if中,并打印“出了问题”。在Genre.addGenre之前的控制台日志记录会导致[object object]。else语句不会执行。它保留在if中,并打印“出了问题”。在Genre.addGenre之前的控制台日志记录会导致[object object].更新,因为当我问同样的问题并花费数小时试图理解我做错了什么时,会出现这个问题。较新版本的express不直接使用bodyparser。这样做:`app.use(express.json());use(express.urlencoded({extended:true}))`更新是因为当我问同样的问题,花了几个小时试图理解我做错了什么时,这个问题突然出现了。较新版本的express不直接使用bodyparser。这样做:`app.use(express.json());use(express.urlencoded({extended:true}))`