Javascript 使用POST方法时Node.js req.body为空
我对使用REST和Express非常陌生,我一直在关注RESTAPI。这是我的app.js代码: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
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}))`