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

Jem*_*Jem 30 post multipartform-data node.js express body-parser

我似乎无法恢复发送到我的Node.js服务器的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
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

登录方法尝试获取req.body.userName,但req.body始终为空.我已经在SO上看到了描述这种行为的其他案例,但没有相关的答案在这里适用.

谢谢你的帮助.

cyb*_*sam 28

通常,快速应用程序需要指定适当的正文解析器中间件才能req.body包含正文.

[EDITED]

  1. 如果您需要解析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());
    
    Run Code Online (Sandbox Code Playgroud)

    首先,您需要将body-parser添加到dependencies您的属性中package.json,然后执行npm update.

  2. 要处理多部分表单数据,bodyParser.urlencoded()正文解析器将无法正常工作.请参阅此处建议的模块以解析多部分主体.

  • OP显示正在使用`body-parser`.但是,该模块不支持`multipart`解析. (2认同)

use*_*748 16

我遵循了这个 https://www.tutorialspoint.com/expressjs/expressjs_form_data.htm

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');
});
Run Code Online (Sandbox Code Playgroud)

  • 当我 `console.log(req.body)` 时,我得到 `{}` (9认同)

San*_*mar 6

要处理支持文件上传的 multipart/form-data 请求,您需要使用 multer 模块。multer 中间件的 npm 链接

  • 如何在multer处理上传之前从帖子中读取正文? (4认同)

yay*_*aya 6

  • 对于 Json:使用body-parser.
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
Run Code Online (Sandbox Code Playgroud)

(您还应该在请求标头中发送Content-Type:)application/json

  • 对于普通表单或多部分表单(带文件的表单),请使用body-parser+ multer
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(multer().array())
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,您不应该发送Content-Type: application/json。您不应该发送任何内容,或者Content-Type: multipart/form-data如果您有表单文件。

  • 在邮递员中,您不应该Content-Type: multipart/form-data手动发送。否则你会得到一个错误( Boundary not found)。(它会自动添加这个。)。)