44

我似乎无法恢复发送到我的 Node.js 服务器的发布请求的表单数据。我已将服务器代码和发布请求放在下面(使用 chrome 中的邮递员发送):

发布请求

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);

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

感谢您的帮助。

4

6 回答 6

37

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

[编辑]

  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您的属性中package.json,然后执行npm update.

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

于 2014-10-13T19:41:33.170 回答
6

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

于 2016-01-21T11:19:03.423 回答
6

我跟着这个 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');
});
于 2020-04-04T07:32:32.220 回答
3

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

于 2018-09-13T18:44:13.010 回答
1
  • 对于 Json:使用body-parser.
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

(您还应该在请求标头中发送Content-Type:)application/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)。(它会自动添加这个。)。)
于 2020-07-13T13:30:03.057 回答
0

确保您没有将 enctype 唱成 multipart/form-data,body 解析器不支持它。在定义任何路线之前使用下面的行。

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

于 2020-04-18T03:50:15.640 回答