2016-06-30 13 views
0

私はAPIを持っており、オブジェクトを更新する必要がある場合はPATCHリクエストを送信する必要があります。問題は、私がPATCHリクエストを送信するとき、ボディは常に定義されていないということです。NodeJS:htmlフォームを使用してPATCH&DELETEリクエストを送信する方法

このように私はPATCHリクエストを送信します。

app.patch('/applications/update/:application_id', function(request, response) { 
      var application_id = request.params.application_id; 
      require('../../models/applications/update_application_by_id').get(request.body, application_id, function(result){ 
       response.render('applications/details', {application_details:result}); 
      }); 
     }); 


<form enctype="application/json" class="form-horizontal" role="form" method="post" action="/applications/update/{{application_details._id}}"> 
<input type="hidden" name="_method" value="PATCH" /> 
<input type="text" name="name" class="form-control"> 
<button type="submit" class="btn btn-yellow pull-right">update</button> 
</form> 

は、私はそれ

exports.get = function(request_body, application_id, call_back){ 
var http_request = unirest("patch", "https://xx/api/applications/"+application_id); 

http_request.headers({ 
    "cache-control": "no-cache", 
    "content-type": "application/json", 
    "x-application-key": "xxxxxxxxxxxxxxxxxx" 
}); 

http_request.type("json"); 
http_request.send(request_body); 

http_request.end(function (http_response) { 
    console.log(http_request.body); 
    if (http_response.error) throw new Error(http_response.error); 

    return call_back(http_response.body); 
}); 
} 

答えて

0

ので、ここで我々はので、私はAPIと話をモデルファイルを持っているので、私はこれらのファイルの私のメソッドを定義し、すべての作り私はAPIと話しているので、私は、非常に簡単な方法で問題を解決

、行きますポストとしてフォームを作成し、ポストボディをパルメーターとしてモデルに渡します。

例で詳しく説明します。

モデルファイル:

var request = require("request"); 

exports.get = function(request_body, application_id, call_back){ 

    var options = { 
     method: 'PATCH', 
     url: 'http://XXXXXXXXXXXXXXXX'+ application_id, 
     headers: 
     { 
      'content-type': 'application/json', 
      'x-application-key': 'XXXXXXXXXXXXXXXXXXX' 
     }, 
     body: request_body, 
     json: true 
     }; 

    request(options, function (error, response, body) { 
     if (error) throw new Error(error); 
     return call_back(body); 
    }); 


}; 

コントローラファイル:

app.post('/applications/update/:application_id', function(request, response) { 
    require('../../models/XXX/XXXX').get(request.body, request.params.application_id, function(result){ 
     response.render('XXXXX/details', {response_update:result}); 
    }); 
}); 

フォームテンプレート:

<form class="form-horizontal" role="form" method="post" action="/applications/update/{{application.[0]._id}}"> 
    <div class="form-group"> 
     <div class="col-sm-4"> 
      <input type="text" name="name" class="form-control" value="{{application.[0].name}}" required> 
     </div> 
    </div> 

<div class="form-group"> 
<div class="col-sm-offset-4 col-sm-4"> 
    <button type="submit" class="btn btn-yellow pull-right">update</button> 
</div> 
</div> 
</form> 
0

をどのように処理するか、これはあなたの要求を自分のラップを解除する必要があります。

あなたのフォームは、実際には、通常のPOSTリクエストを送信している:

<form enctype="application/json" class="form-horizontal" role="form" method="post" action="/applications/update/{{application_details._id}}"> 

は、だから、POSTにPATCH/DELETE、 _methodであることを変換し、ルートやミドルウェアを必要としています。

https://github.com/expressjs/method-override/blob/master/README.md

かなり標準的なアプローチが、それは期待しています実際のフィールド名に注意してください。

+0

私はすでにの はフォームの中で動作しません –

+0

yで明示的に処理しないとうまくいかないええ。 ExpressJS **はこれをしません**。 – kazenorin

0

あなたはミドルウェアエクスプレス/ methodoverrideをインストールし、app.use()INGのオフ最高です。

関連する問題