web-dev-qa-db-ja.com

Express jsボディパーサーが機能していませんか?

Expressを使用しているノードサーバーに次のものがあります(重要な部分に切り捨てられています)。

var app = express.createServer();

app.all(/test/,function(req,res){
    console.log(req.headers);
    console.log(req.body);
    res.send("");
});

function appStart(cobrands){
    app.configure(function(){
        app.use(express.bodyParser());
        app.use(express.cookieParser());

        app.use('/min',express.static('../min'));
        app.use('/js',express.static('../js'));
        app.use('/css',express.static('../css'));
        app.use('/img',express.static('../img'));
    });
    app.listen(8080);
}

次に、次のようにlocalhost:8080を呼び出す単純なフォームがあります。

<form action="http://localhost:8080/test" method="post">
    <input type="hidden" name="test" value="testing"/>
    <input type="submit" name="submit" value="to node"/>
</form>

しかし、express.bodyParserは何もしていないようで、req.bodyは未定義です。 console.logsの出力は次のとおりです。

// req.headers
{ Host: 'localhost:8080',
  'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_1) AppleWebKit/534.48.3 (KHTML, like Gecko) Version/5.1 Safari/534.48.3',
  'content-length': '27',
  accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  Origin: 'file://',
  'content-type': 'application/x-www-form-urlencoded',
  'accept-language': 'en-us',
  'accept-encoding': 'gzip, deflate',
  cookie: '',
  connection: 'keep-alive' }
// req.body
undefined

注:content-typeはbodyParserが機能するためにapplication/x-www-form-urlencodedとして正しく定義されており、Safariでデバッグツールを開いてフォームデータが存在することを確認することで、それが実行されることを確認しました。 。

11
Jesse

http://expressjs.com/guide.html#configuration

App.routerの使用に注意してください。これは、(オプションで)アプリケーションルートをマウントするために使用できます。そうでない場合、app.get()、app.post()などへの最初の呼び出しでルートがマウントされます。

何が起こっているのかというと、他のミドルウェアを追加する前にapp.all()を呼び出しているということです。これを効果的に行うと、app.routerが他のすべてのミドルウェアの前に配置され、ルート内で終了するリクエストでそれらが使用されることはありません。

アプリケーションルートのマウントは、app.use(app.router);を実行するのとほとんど同じです。

結局、あなたのスタックは次のようになります:

app.use(app.router); // Contains your /test/ route
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use('/min',express.static('../min'));
app.use('/js',express.static('../js'));
app.use('/css',express.static('../css'));
app.use('/img',express.static('../img'));

tl; dr app.configure()の呼び出しとapp.listen()の呼び出しの間でルートを移動します。

20
Ryan Olds

私も同様の問題を抱えていましたが、これはexpress.bodyParser()が壊れている/欠落しているためであることがわかりました。代わりに、expressのbodyParserを使用しましたが、connectのbodyParserを使用しました。

app.use(require('connect').bodyParser());
2