2016-03-29 8 views
0

私のPOSTメソッドがMongoose経由で私のMongoDBに保存されない理由を教えてもらえますか?ローカルノードAPIがマングースDBにPOST

マイ角度コントローラ

$scope.saveUpdate = function(id){ 
    $http.post('/api/entry/' + id) 
     .success(function(data){ 
      $scope.entry = data; 
     }) 
     .error(function(data){ 
      console.log('There was a problem saving your entry: ' + data); 
     }); 
    // update page with remaining entries 
    $http.get('/api/entries').then(function(response){ 
     $scope.entries = response.data; 
    }); 
} 

マイAPI

app.post('/api/entry/:entry_id', function(req, res){ 
    if (req.params) { 
     Entries.findByIdAndUpdate({ 
     _id : req.params, 
     // the properties we're updating and the new values 
     username: req.body.username, 
     date: req.body.date, 
     income: req.body.income 
     }, function(err, entry){ 
     if (err) { 
      res.send(err) } 
      else { 
      res.send('Success!'); 
      } 
     }) 
    } 
}); 

更新されたエントリは、ボタンがクリックされたDOMを打つが、ときに

<button type="submit" class="btn" ng-click="saveUpdate(entry._id)">Update</button> 

ビューにボタンを提出Angularコアコードに当たって、DBを更新せずに元の状態に戻ります。エラーもスローされません。

答えて

1

は、上記のコードで間違ったいくつかのことがあります。

全体 req.paramsオブジェクトが代わりに req.params.entry_id
  • パラメータがfindByIdAndUpdate()に渡される方法の_idフィールドに渡される
    1. が正しくありません
    2. $http.post()でリクエストの本文が送信されることはありませんが、req.bodyにはルートにデータが含まれていることが予想されます

    req.paramsを指す全体のparams要求のオブジェクト。 paramsからIDを取得し、それをあなたのマングースモデルに渡したいだけです。

    entry_idを渡すと仮定すると、最初の条件はif(req.params)になります。これは、実際にはparamsが存在するためです。しかし、あなたがEntriesモデルのreq.params_idフィールドに渡すと、実際にはの代わりに123の代わりにオブジェクト全体が渡されます。

    また、findByIdAndUpdateメソッドに値を渡す方法が間違っています。 4つのパラメータがあり、findByIdAndUpdate(id, [update], [options], [callback])idが唯一の必須フィールドです。あなたはオブジェクト全体を渡してidに基づいて検索し、単一の引数で値を更新します。更新したいフィールドからentry_idを抜き出す必要があります。 $http.put()を行うときにreq.bodyに値を渡している場所

    app.post('/api/entry/:entry_id', function(req, res) { 
    
        // Param Existence Checking 
        if (!req.params.entry_id) 
        return res.status(400).send('an entry_id must be provided'); 
        if (!req.body.username) 
        return res.status(400).send('a username must be provided'); 
        if (!req.body.date) 
        return res.status(400).send('a date must be provided'); 
        if (!req.body.income) 
        return res.status(400).send('an income must be provided'); 
    
        var updateData = { 
        username: req.body.username, 
        date: req.body.date, 
        income: req.body.income 
        }; 
    
        Entries.findByIdAndUpdate(req.params.entry_id, updateData, function(err, entry){ 
        if (err) 
         return res.status(500).send(err) 
    
        return res.status(200).send('Success!'); 
        }) 
    
    }); 
    

    また、あなたの質問からのサンプルコードに基づいて、私は表示されません。確かに、req.bodyusernameが含まれていない場合、dateincomeの場合、これらのフィールドにはundefinedが割り当てられます。

    $http.post()でリクエスト本文を入力するには、2番目のパラメータdataに渡します。

    $http.post('/api/entry/' + id, { 
        username: 'username', 
        date: new Date(), 
        income: 10000.00 
    }) 
        .then(function(res, status){ 
        console.log(res.data); 
        }) 
        .catch(function(err) { 
        console.log(err); 
        }); 
    

    また、あなたの約束チェーン、that approach is deprecated.success()を使用しないでください。応答を処理するときは、A +標準.then().catch()を使用する必要があります。

  • +0

    あなたの言っていることが分かります。 'entry_id'を私の要求に置き換えた後も残念ながらDBは更新されません。これは、angular.jsコアファイル内の 'completeRequest'コールバックに当たったとき元のエントリに戻ります。これがなぜなのか分かりません。 – PanicBus

    +0

    @PanicBus私の答えを見て、私は私の答えで 'Entries.findByIdAndUpdate()'への呼び出しを更新しました。最初のパラメータは 'req.params.entry_id'と一致する' _id'値でなければなりません。 2番目のパラメータはフィールドのオブジェクトであり、値は更新されます。 1つのオブジェクトのIDとIDの間違ったパラメータを渡しています。 [Model.findByIdAndUpdate Docs](http://mongoosejs.com/docs/api.html#model_Model.findByIdAndUpdate) – peteb

    +0

    私は何が起こっているのかを見ています。そして、あなたは正しい、 'body'は空のオブジェクト' body:{} 'として来ています。あなたはそれがなぜ、そしてreqから来るデータをどのように構文解析するのかについて、わかっていますか?私はbody-parserミドルウェアを含めて使用しています。 – PanicBus