【问题标题】:Express request body for post is undefined帖子的快速请求正文未定义
【发布时间】:2016-04-06 05:37:56
【问题描述】:

我的 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())

在加载路线之前,应该没问题,但似乎没有。

【问题讨论】:

  • 尝试在 app.use(bodyParser.json()); 之前添加这一行app.use(bodyParser.urlencoded({extended: true }));
  • 不走运 :( 这应该是微不足道的,不知道为什么 express 不支持它们内置。
  • 我推荐使用 express generator 生成一个 express 应用,看这里:expressjs.com/en/starter/generator.html
  • 其实这和我的目录结构一模一样,唯一改变的是我没有调用启动脚本www.js,而是重命名为server.js
  • 您如何向服务器发出 POST 请求?具体来说,您将 Content-Type 设置为哪些请求?请注意,bodyParser 不处理 Content-Type 设置为 multipart/form-data 的请求:npmjs.com/package/body-parser

标签: javascript node.js express


【解决方案1】:

问题在于您在 POST 请求中发送的资源类型。

您的 bodyParser.json() 仅解析 json 格式。或者换句话说,如果您只是发布一个简单的 form,在大多数情况下默认为 application/x-www-form-urlencoded,您将不会获得 body 对象。

如文档中所述:

返回只解析 json 并且只查看请求的中间件 其中 Content-Type 标头与类型选项匹配。

type - type 选项用于确定中间件的媒体类型 会解析。 默认为 application/json。

解决方案是实施并从其他场景中汲取灵感:

application/x-www-form-urlencoded

app.use(bodyParser.urlencoded())

多部分/表单数据

Express 不解析文档中所述的多部分正文:

这不处理多部分实体,因为它们的复杂性和 通常大的性质。对于多部分实体,您可能对 以下模块:

  1. busboyconnect-busboy
  2. 多方连接多方
  3. 强大
  4. multer

对于 Express 版本:+4.17.0

您不能包含 bodyParser 依赖项。并使用 express 内置方法:

express.json()   
express.text() 
express.urlencoded()

它们是基于 bodyParser 模块构建的,因此调用 bodyParser.json()。你会做express.json() 并获得相同的结果。

来源: https://expressjs.com/en/resources/middleware/body-parser.html#bodyparserurlencodedoptions

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多