Node.js(使用express和bodyParser):无法从post请求中获取表单数据

Node.js(使用express和bodyParser):无法从post请求中获取表单数据,node.js,express,post,multipartform-data,body-parser,Node.js,Express,Post,Multipartform Data,Body Parser,我似乎无法恢复发送到Node.js服务器的post请求的表单数据。我在下面列出了服务器代码和post请求(使用chrome中的postman发送): 发布请求 POST /api/login HTTP/1.1 Host: localhost:8080 Cache-Control: no-cache ----WebKitFormBoundaryE19zNvXGzXaLvS5C Content-Disposition: form-data; name="userName" jem ----Web

我似乎无法恢复发送到Node.js服务器的post请求的表单数据。我在下面列出了服务器代码和post请求(使用chrome中的postman发送):

发布请求

POST /api/login HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="userName"

jem
----WebKitFormBoundaryE19zNvXGzXaLvS5C
NodeJS服务器代码

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(bodyParser());

app.all('/*', function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');
    next();
});

var port = process.env.PORT || 8080;        // set our port

var router = express.Router();              // get an instance of the express Router

router.get('/', function(req, res) {

    res.json({ message: 'I am groot!' });   
});

// Login
router.route('/login')

    .post(function(req, res){

        console.log('Auth request recieved');

        // Get the user name
        var user = req.body.userName;

        var aToken = getToken(user);

        res.json({

            'token':'a_token'
        });
    });

app.use('/api', router);

app.listen(port);
登录方法尝试获取
req.body.userName
,但是,
req.body
始终为空。 我见过其他描述这种行为的案例,但没有一个相关的答案适用于这里


感谢您的帮助。

一般来说,express应用程序需要指定适当的代码,以便
req.body
包含正文

[已编辑]

  • 如果需要解析url编码(非多部分)表单数据以及JSON,请尝试添加:

    // Put this statement near the top of your module
    var bodyParser = require('body-parser');
    
    
    // Put these statements before you define any routes.
    app.use(bodyParser.urlencoded());
    app.use(bodyParser.json());
    
    首先,您需要添加到
    package.json的
    dependencies
    属性中,然后执行
    npm更新

  • 要处理多部分表单数据,
    bodyParser.urlencoded()
    body解析器将无法工作。有关解析多部分实体的详细信息,请参见


  • 要处理支持文件上载的多部分/表单数据请求,您需要使用multer模块

    确保按以下顺序排列: 首先是bodyParser.json()。
    
    use(bodyParser.json());
    use(bodyParser.urlencoded({extended:true}));
    

    我遵循了这一点


    确保您没有将enctype作为多部分/表单数据,主体解析器不支持它。 在定义任何管线之前,请使用“线下”

    use(bodyParser.urlencoded()); use(bodyParser.json())

    • 对于Json:使用
      主体解析器
    (您还应该在请求头中发送
    内容类型
    应用程序/json

    • 对于普通表单或多部分表单(带文件的表单),请使用
      主体解析器
      +
      multer
    (在这种情况下,您不应发送
    内容类型:application/json
    。如果表单中有文件,则不应发送任何内容,或
    内容类型:多部分/表单数据

    • 在“邮递员”中,您不应手动发送
      内容类型:多部分/表单数据。否则您将收到错误(
      未找到边界
      )。(它将自动添加此项。)

    问题在于请求的主体是,而
    主体解析器
    模块不支持以该格式解析数据。为您可以使用的其他模块提供建议。或者,如果
    POST
    请求中的数据不需要
    multipart
    ,则可以将其作为发送。这是
    bodyParser.urlencoded()
    解析的格式。确实,感谢您指出。我对HTTP的了解是有限的,所以不知道URL编码的形式。这样,我的node.js就可以正确地处理来自小角度前端的post请求。谢谢你的帮助!OP显示正在使用
    正文解析器。但是,该模块不支持
    multipart
    解析。我已经编辑了我的答案,以包含对多部分表单解析建议模块的引用。谢谢@Jonathan的推荐。谢谢你的帮助。事实上,我发送表单数据时,并不知道服务器能够接受url编码的数据。本文将介绍url编码与表单数据的优缺点。再次感谢!在multer处理上传之前,如何阅读帖子正文?@Camilortegón您在上面的评论中找到了问题的解决方案吗?解释一下原因会很有帮助。Carles Alcolea,这两个都是中间件,将按此顺序执行。我还没有看过源代码,但我敢打赌,如果主体是JSON,那么使用urlenconded first,它可能会返回一个错误,而不是跳过并调用下一个中间件。这可能就是JSON模块所做的,它不是一个JSON,跳过(call next()),而不是发送一个错误并调用下一个中间件。我的意思是在编辑您的答案时为阅读它的任何人添加一个急需的解释。当我们证明我们的答案是正确的时,它更具教育意义和清晰性。它也帮助我们确定我们的答案;P
    var bodyParser = require('body-parser');
    var multer = require('multer');
    var forms = multer();
    
    // apply them
    
    app.use(bodyParser.json());
    app.use(forms.array()); 
    app.use(bodyParser.urlencoded({ extended: true }));
    
    // how to use
    
    router.post('/', function(req, res) {
        console.log(req.body);
        console.log('received the widget request');
    });
    
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({extended: true}))
    
    app.use(bodyParser.json())
    app.use(bodyParser.urlencoded({extended: true}))
    app.use(multer().array())