1

Express 4.0.0 を使用して API を作成していますが、ルートの 1 つで POST が実行されます。現在、リクエストパラメーターで送信された名前をエコーするようにしています。応答は JSON オブジェクトですが、要求にはフォーム フィールドが必要です。

users.post '/user', (req, res) ->
    res.json name: req.params.name

私のテストでは、ハッシュを POST パラメーター/フィールドとして渡すことができるように設定type()されています。formsend()

describe 'POST /user', ->
    it 'should echo the name sent', (done) ->
        request app
        .post '/user'
        .type 'form'
        .send name: 'Foo'
        .expect '{"name":"Foo"}'
        .end done

いずれにせよ、私のテストは失敗し、Express では、myreq.paramsは空で、req.param('name')起動しundefined、空req.bodyでもあります。

私が認識していない属性がありますかreq.fields、それとも私のテストに何らかの欠陥がありますか?

4

1 に答える 1

2

tl;dr: 本体を解析してそれを取得する必要があります。app.use(require('body-parser')())それを実行してから、コードを で変更できますname: req.param('name')

そのため、エクスプレス (および実際には node.js http サーバー) は、リクエストの本文ではなく、http リクエスト ヘッダーが受信されるたびにリクエスト呼び出しを呼び出します。明示的に読み取り、本文が来るのを待って自分で解析する必要があります。

幸いなことに、本体を解析する高速ミドルウェア モジュールがあります。この場合、urlencoded/form ボディを送信しているため、そのように解析する必要があります。例に従って、これらのモジュールのいずれかを使用します。

を使用すると仮定するとbody-parser、すべてのルートの本文を解析したい場合は、app.use(require('body-parser')(). 特定のルートの本文を解析する場合は、次のようにします。

bodyParser = require('body-parser')()
app.post '/user', bodyParser, (req, res) ->
    res.json name: req.param('name')

req.body本文の解析が正しく行われると、 (たとえばreq.body.name) プロパティまたはreq.param関数 (たとえば )を介してアクセスできますreq.param('name')。後者は、クエリ文字列と URL パラメーターも検索します。

(ファイルをアップロードするために)添付ファイルを含む本文を解析する場合は、urlencoded パーサーだけでなく、マルチパート パーサーが必要であることに注意してください。

于 2014-04-16T17:59:56.290 に答える