对于删除功能的API不再工作,不会删除阵列什么? [英] API for delete function is not working anymore and doesn't remove anything from array?

查看:172
本文介绍了对于删除功能的API不再工作,不会删除阵列什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我尝试从视图中删除一个职位显然表明,它被删除。然而,当我回去的路线提供我可以通过以下途径找到所有的数组previous成员。然而,当我在路由/职位不显示我的previous删除成员。有意思的是,那安舒页面后不显示我对我观点的记录了。
在下面的路线,后消失,而我从命令提示符尝试:

When i try to remove one post from view apparently shows that it is removed. However when i go back in providers route i can find all the previous member of array through below route . However when i am in route of /posts doesn't show me previous removed members. Interesting it is that after refreshing page it doesn't show me record on my view anymore. In following route, post disappear while i try it from command prompt :

/供应商/ 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成员。似乎任何移除的不工作

However in this route, i can find posts array with 9 member. It seems that any of the removed doesn't work.

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

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

下面是在服务器端我删除功能:

Here is my remove function in server side:

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);
            }
        });
    });
});

在这里,我有什么我厂里面客户端:

And here what i have inside my factory in client side:

 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;
            });
    };

这是我的观点的一部分:

And here is one part of my view:

<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 正在更新。对于看的供应商,并张贴意见您可以查看以下<一个href=\"http://stackoverflow.com/questions/29855111/how-query-api-to-get-all-the-data-for-third-level-of-path\">link.
谢谢你。

Never provider.posts.length is updating. For watching provider and post views you can review following link. Thank you.

推荐答案

我相信你使用了错误的模型在更新语句:

I believe you are using the wrong model in your update statement:

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方法以及内置的承诺,这些连锁在一起容易阅读:

Also, you could use the findByIdAndXXX methods as well as the built in promises to chain these together for easier readability:

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方式:

Update: to use a where clause you will need to switch to findOneAndXXX methods:

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
  });
});

这篇关于对于删除功能的API不再工作,不会删除阵列什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆