2015-04-28 95 views
1

當我嘗試從視圖中刪除一個帖子顯然表明它被刪除。然而,當我回到供應商路線,我可以通過下面的路線找到所有以前的數組成員。但是,當我在/帖子的路線不顯示我以前刪除的成員。有趣的是,刷新頁面後,它不再顯示我在我的視圖上的記錄。 在以下的路徑,交消失而我嘗試從命令提示:刪除函數的API不再工作,不會從數組中刪除任何東西?

/提供商/ 553b72c9f6d0020425d37f37 /帖

router.get('/providers/:provider/posts', function(req, res) { Provider.findById(req.params.provider).select('posts').populate('posts').exec(function(err, provider) { 
     if(err){ return next(err); } 
     res.json(provider.posts); 
    }); 
}); 

然而,在這條路線,我可以找到帖子陣列9構件。看來,任何刪除不起作用。

router.get('/providers', function(req, res, next) { 
    Provider.find(function(err, providers){ 
     if(err){ return next(err); } 

     res.json(providers); 
    }); 
}); 

這裏是服務器端的我的刪除功能:

router.delete('/providers/:provider/posts/:post',auth, function(req, res){ 
    console.log("I ma running from server") 
    return Post.findById(req.params.post, function(err, post){ 
     return post.remove(function(err){ 
      if(!err){ 
       Post.update({_id: post.provider}, {$pull : {posts : post._id}}, function(err, numberAffected){ 
        console.log(numberAffected); 
        if(!err){ 
         return console.log('removed post id'); 
        } else { 
         return console.log(err); 
        } 
       }); 
       console.log('post removed'); 
       return res.send(''); 
      } else{ 
       console.log(err); 
      } 
     }); 
    }); 
}); 

在這裏,我有我的工廠裏面的客戶端:

ob.deletePost = function (provider_id,post_id) { 
     return $http.delete(urlBase +'/providers/' + provider_id +'/posts/' + post_id , 
      { 
      headers: {Authorization: 'Bearer '+auth.getToken()} 
     }); 
    }; 

並在控制器:

$scope.deletePost= function (provider_id,post_id) { 
     //console.log('PROVIDER',provider_id); 
     // console.log('POST',post_id); 
     // console.log('COMMENT',comment_id); 

     providers.deletePost(provider_id,post_id) 

      .success(function() { 
       $scope.status = 'Deleted Post! Refreshing post list.'; 

       for (var i = 0; i < $scope.provider.posts.length; i++) { 
        var post = $scope.provider.posts[i]; 
        // console.log(i,comment,comment_id) 
        //console.log(comment.ID); 
        if (post._id === post_id) { 
         //console.log(provider._id === provider_id) 
         // console.log(provider._id); 
         $scope.provider.posts.splice(i, 1); 
         //providers.getAllComments(); 
         break; 
        } 
       } 
       // $scope.providers = null; // i am not sure how to write for comment as well? 

      }) 
      .error(function (error) { 
       $scope.status = 'Unable to delete comment: ' + error.message; 
      }); 
    }; 

這是我的一部分視圖:

<div ng-repeat="provider in providers"> <!-- | orderBy:'-upvotes'--> 
     <span class="glyphicon glyphicon-thumbs-up" 
       ng-click="incrementUpvotes(provider)"></span> 
     <span style="font-size:18px; margin-left:10px;"> 
       {{provider.upvotes}} - <strong>{{provider.name}}</strong> 
      <span ng-if="provider.posts.length !== 0"> 
       <a ui-sref="post({provider_id : provider._id})">{{provider.posts.length}} Posts </a> 
       <button class="btn btn-xs btn-info pull-right" ng-click="modalUpdateProvider('size',provider)">Edit</button> 
      </span> 

決不provider.posts.length正在更新。對於觀看供應商和後視圖您可以查看以下link。 謝謝。

+0

刪除服務器端的帖子,但不更新客戶端的提供程序。您必須重新加載提供程序或手動刪除帖子。 – Michael

+0

@ michael,我更新了一個。我在控制器裏面做了。 –

回答

1

我相信你正在使用您的更新語句錯型號:

router.delete('/providers/:provider/posts/:post', auth, function(req, res) { 
    console.log("I ma running from server"); 
    // NOTE: you could also include a where clause to ensure the 
    // provider ID matches as well. This would prevent someone from using any 
    // provider ID (inclduing one that doesn't exist) with a post ID. 
    return Post.findById(req.params.post, function(err, post) { 
    // Might want to check for an error here 
    console.log('post removed'); 

    return post.remove(function(err) { 
     if (!err) { 
     //Post.update({ 
     Provider.update({ 
      _id: post.provider // or req.params.provider 
     }, { 
      $pull: { 
      posts: post._id 
      } 
     }, function(err, numberAffected) { 
      console.log(numberAffected); 
      if (!err) { 
      console.log('removed post id'); 
      } else { 
      console.log(err); 
      } 
      return res.send(''); 
     }); 
     } else { 
     console.log(err); 
     } 
    }); 
    }); 
}); 

此外,您還可以使用findByIdAndXXX方法以及內置的承諾鏈這些結合在一起,可讀性更強:

router.delete('/providers/:provider/posts/:post', auth, function(req, res) { 
    console.log("I ma running from server"); 
    // NOTE: you could also include a where clause to ensure the 
    // provider ID matches as well. This would prevent someone from using any 
    // provider ID (inclduing one that doesn't exist) with a post ID. 
    return Post.findByIdAndRemove(req.params.post).exec().then(function(post) { 
    console.log('post removed'); 
    return Provider.findByIdAndUpdate(req.params.provider, { 
     $pull: { 
      posts: post._id 
     } 
     }, { 
     new: true 
     } // Return updated document 
    ).exec(); // return promise to be evaluated for next handler 
    }).then(function(provider) { 
    console.log('removed post id'); 
    res.send(''); 
    }).then(null, function(err) { 
    console.log(err); 
    //might want to send a response error here 
    }); 
}); 

更新:使用WHERE子句,你需要切換到findOneAndXXX方法:

router.delete('/providers/:provider/posts/:post', auth, function(req, res) { 
    console.log("I am running from server"); 
    return Post.findOneAndRemove({_id: req.params.post, provider_id: req.params.provider}).exec().then(function(post) { 
    console.log('post removed'); 
    return Provider.findByIdAndUpdate(req.params.provider, { 
     $pull: { 
      posts: post._id // or req.params.post 
     } 
     }, { 
     new: true 
     } // Return updated document 
    ).exec(); // return promise to be evaluated for next handler 
    }).then(function(provider) { 
    console.log('removed post id'); 
    res.send(''); 
    }).then(null, function(err) { 
    console.log(err); 
    //might want to send a response error here 
    }); 
}); 
+0

你很好..謝謝。 @Jason Cust –

+0

你的意思是像'if(provider_id === provider._id){rest of code}'.. –

+0

更新了答案以顯示如何在查詢中執行此操作。 –