web-dev-qa-db-ja.com

Node.js(エクスプレスとbodyParserを使用):ポストリクエストからフォームデータを取得できません

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

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でこのような動作を説明する他のケースを見てきましたが、ここでは関連する回答は適用されませんでした。

手伝ってくれてありがとう。

28
Jem

一般的に、エクスプレスアプリでは、_req.body_に本文を含めるために、適切な body-parserミドルウェア を指定する必要があります。

[編集済み]

  1. JSONだけでなく、URLエンコード(非マルチパート)フォームデータの解析が必要な場合は、以下を追加してみてください。

    _// 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 を_package.json_のdependenciesプロパティに追加してから、_npm update_を実行する必要があります。

  2. マルチパートフォームデータを処理するために、bodyParser.urlencoded()ボディパーサーは機能しません。マルチパートボディの解析については、 ここに推奨されるモジュール を参照してください。

26
cybersam

ファイルのアップロードをサポートするmultipart/form-dataリクエストを処理するには、multerモジュールを使用する必要があります。 multerミドルウェアのnpmリンク

4
Sanjeev Kumar

BodyParser.json()を最初にこの順序で配置してください。 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));

1
Aecio Levy