我在 app.js :
中进行了以下设置var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.json());
var router = express.Router();
require('./routes/index')(router);
app.use(router);
在我的 routes / index.js 中,我定义了所有路线:
module.exports = function (router) {
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Home' });
});
router.post('/', function(req, res, next) {
console.log(req.body);
});
}
然后在我的应用入口点 bin / server.js :
var app = require('../app');
var debug = require('debug')('NodeJSDemo:server');
var http = require('http');
var port = 3000;
app.set('port', port);
var server = http.createServer(app);
server.listen(port);
当我在http://localhost:3000/上使用请求正文进行POST调用时,在控制台日志控制台中,日志请求正文未定义。
我的设置有什么问题吗?从这篇文章Express.js req.body undefined看来,只要我打电话
app.use(bodyParser.json())
在加载路线之前,它应该没问题,但似乎没有。
答案 0 :(得分:0)
问题来自于您在 POST 请求中发送的资源类型。
您的bodyParser.json()
仅解析 json 格式。换句话说,如果您简单地发布一个简单的 form ,大多数情况下默认为application/x-www-form-urlencoded
,您将不会获得body对象。
如文档中所述:
返回仅解析json并且仅查看请求的中间件 Content-Type标头与type选项匹配。
和
type -类型选项用于确定中间件是哪种媒体类型 将解析。 默认为 application / json。
解决方案是在其他情况下实施和收集:
应用程序/ x-www-form-urlencoded
app.use(bodyParser.urlencoded())
多部分/表单数据
Express不会按文档中所述解析多部分主体:
由于多部分实体的复杂性和 通常是大自然。对于多部分实体,您可能会感兴趣 以下模块:
- busboy 和 connect-busboy
- 多方和连接多方
- 好看的
- multer
您不能包含bodyParser依赖项。并将快速内置方法用作:
express.json()
express.text()
express.urlencoded()
它们是基于bodyParser模块构建的,因此可以调用bodyParser.json()
。您将做express.json()
并获得相同的结果。
来源: https://expressjs.com/en/resources/middleware/body-parser.html#bodyparserurlencodedoptions