我已尝试过其他一些stackoverflow帖子的所有解决方案,但它并没有解决我的问题。
这是我的app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
var index = require('./routes/index');
var v1 = require('./routes/route');
app.use('/', index);
//routes for api
app.use('/v1',v1);
这是我的post
控制器
module.exports = {
createUser:function (req,res) {
console.log(req.body);
res.send('ok'+req.body.test);
}
}
即使请求正文包含参数, req.body
也会返回{}
。
我正在用postman插件检查api。
更新
邮差要求
答案 0 :(得分:2)
bodyParser对象公开了各种工厂来创建中间件。所有中间件都将使用已解析的主体填充req.body
属性,如果没有要解析的主体(或返回错误),则填充空对象{}
。
app.use(bodyParser.urlencoded({ extended: true })); // for encoded bodies
在中间件
req.body
将包含解析数据后,请求对象上填充包含已解析数据的新主体对象,此对象将包含键值对,其中值可以是字符串或数组
内容类型为application/x-www-form-urlencoded
app.use(bodyParser.json()); // for json encoded bodies
在中间件(即
req.body
)之后的请求对象上填充包含已解析数据的新body对象。
内容类型为application/json
application/json
时,会使用 {"test":"hello"}
。 www-form-url-encoded
用于在使用app.use(bodyParser.urlencoded({ extended: true }));
时将数据作为对象中的键值从URL获取。它们都是不同的,并有自己的用例
答案 1 :(得分:1)
删除最后4行代码后(确保正确配置路由)并添加此测试行:
app.post('/ping', function (req,res) {
console.log(req.body);
res.send('ok ' + req.body.test);
});
let server = http.createServer(app);
server.listen(8899, function onstart() {
console.log('server listening');
});
当我跑步时:
curl -X POST http://localhost:8899/ping -d '{"test": 1234}'
我得到ok undefined
,就像你一样。添加适当的content-type
标题后:
curl -X POST http://localhost:8899/ping -d '{"test": 1234}' -H "content-type: application/json"
它就像一个魅力,我得到ok 1234
。所以我认为你错过邮递员的"content-type: application/json"
标题。