Express js req.body 返回空

Posted

技术标签:

【中文标题】Express js req.body 返回空【英文标题】:Express js req.body returns empty 【发布时间】:2017-08-30 20:43:46 【问题描述】:

我已经尝试了其他一些 *** 帖子中的所有解决方案,但它并没有解决我的问题。

这是我的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 返回,即使请求正文包含参数。

我正在使用邮递员插件检查 api。

更新

邮递员请求

【问题讨论】:

你需要发送json,而不是form-data 对,有,需要选择“raw”,选择“application/json” 在原始选项中是否选择了类型JSON(application/json) 啊,不是真正的JSON,应该是"test":"hello" application/json 用于像这样发布数据 "test":"hello" 时使用,www-form-url-encoded 用于在使用 bodyParser.urlencoded 时从 url 获取数据作为对象中的键值,它们都是不同的,都有自己的用例 【参考方案1】:

body-parser

bodyParser 对象暴露了各种工厂来创建中间件。所有中间件都将使用解析后的主体填充 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)。

Content-Type 是application/json


application/json 在您像这样发布数据"test":"hello" 时使用。当使用app.use(bodyParser.urlencoded( extended: true )); 时,www-form-url-encoded 用于从 url 获取对象中的数据作为 key-value。它们都是不同的,并且有自己的用例

【讨论】:

【参考方案2】:

删除最后 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" 标头。

【讨论】:

我已经不止一次被那个烧伤了:(

以上是关于Express js req.body 返回空的主要内容,如果未能解决你的问题,请参考以下文章

当我将 event.preventDefault() 与 fetch api、express 和 node.js 一起使用时,为啥 req.body 返回 null? [复制]

Nodejs express 获取url参数,post参数的三种方式

req.body 返回空数据,如何解决?

express.js 中 req.body 的目的是啥?

express开发实例

express.js get 方法无法获取 req.body 值