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

时间:2014-10-13 19:23:40

标签: node.js express post multipartform-data body-parser

我似乎无法恢复发送到Node.js服务器的发布请求的表单数据。我把服务器代码和帖子请求放在下面(使用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始终为空。 我已经在SO上看到了描述这种行为的其他案例,但没有相关的答案在这里适用。

感谢您提供帮助。

6 个答案:

答案 0 :(得分:22)

通常,快递应用需要指定适当的body-parser middleware,以便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());
    

    首先,您需要将body-parser添加到dependencies的{​​{1}}媒体资源中,然后执行package.json

  2. 要处理多部分表单数据,npm update正文解析器将无法正常工作。请参阅suggested modules here以解析多部分正文。

答案 1 :(得分:4)

要处理支持文件上载的multipart / form-data请求,您需要使用multer模块。 npm link for multer middleware

答案 2 :(得分:2)

我遵循了 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');
});

答案 3 :(得分:1)

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

答案 4 :(得分:0)

确保您不使用enctype作为multipart / form-data,body解析器不支持它。 在定义任何路线之前,请在下面的行中使用。

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

答案 5 :(得分:0)

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

(您还应该在请求标头中发送Content-Typeapplication/json

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

(在这种情况下,您不应发送Content-Type: application/json。您不应发送任何内容;如果文件中包含格式文件,则不应该发送Content-Type: multipart/form-data

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