Express js的req.body返回空值

5

我尝试了一些其他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。

更新

Postman 请求

enter image description here


1
你需要发送 JSON 数据,而不是表单数据。 - Creynders
1
在原始选项中,您是否选择了类型为 JSON(application/json) - parwatcodes
1
啊,这不是真正的JSON,应该是{"test":"hello"} - Creynders
1
当您像这样发布数据{"test":"hello"}时,使用application/json,当使用bodyParser.urlencoded时,www-form-url-encoded用于从URL中获取数据作为对象中的键值, 它们都是不同的,具有自己的用例。 - parwatcodes
1
以答案的形式提交您的评论,@p0k8。 - Jabaa
显示剩余15条评论
2个回答

5

body-parser

body-parser对象提供了多种工厂函数来创建中间件。所有的中间件都会将解析后的请求体填充到req.body属性中,如果没有请求体需要解析(或者解析出错),则填充一个空对象{}


app.use(bodyParser.urlencoded({ extended: true })); // for encoded bodies

在中间件之后,一个新的包含解析数据的body对象会填充到请求对象上,req.body将包含解析后的数据,该对象将包含键值对,其中值可以是字符串或数组。

Content-Type为application/x-www-form-urlencoded

app.use(bodyParser.json()); // for json encoded bodies

在中间件(即req.body)之后,一个新的包含解析数据的body对象将填充在请求对象中。
Content-Type是application/json
当您像这样发布数据{"test":"hello"}时,会使用application/json。当使用app.use(bodyParser.urlencoded({ extended: true }));时,www-form-url-encoded用于从URL中以键值对的形式获取数据。它们都各自有不同的用例。

3

删除最后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。因此我认为你在postman中缺少"content-type: application/json"标题。


我已经被那个坑过不止一次了 :( - grahamrhay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接