用于删除功能的 API 不再工作并且不会从数组中删除任何内容? [英] API for delete function is not working anymore and doesn't remove anything from array?
问题描述
当我尝试从视图中删除一篇文章时,显然表明它已被删除.但是,当我回到提供者路线时,我可以通过以下路线找到数组的所有先前成员.但是,当我在/posts 路线中时,不会向我显示以前删除的成员.有趣的是,刷新页面后,它不再显示我的视图中的记录.在以下路线中,当我从命令提示符尝试时,帖子消失了:
/providers/553b72c9f6d0020425d37f37/posts
router.get('/providers/:provider/posts', function(req, res) { Provider.findById(req.params.provider).select('posts').populate('posts').exec(function(err, provider) {如果(错误){ 返回下一个(错误);}res.json(provider.posts);});});
但是在这条路线中,我可以找到包含 9 个成员的帖子数组.似乎任何删除的都不起作用.
router.get('/providers', function(req, res, next) {Provider.find(function(err, providers){如果(错误){ 返回下一个(错误);}res.json(提供者);});});
这是我在服务器端的删除功能:
router.delete('/providers/:provider/posts/:post',auth, function(req, res){console.log("我从服务器运行")返回 Post.findById(req.params.post, function(err, post){返回 post.remove(function(err){如果(!错误){Post.update({_id: post.provider}, {$pull : {posts: post._id}}, function(err, numberAffected){console.log(numberAffected);如果(!错误){return console.log('removed post id');} 别的 {返回 console.log(err);}});console.log('帖子删除');返回 res.send('');} 别的{控制台日志(错误);}});});});
这里是我在客户端的工厂里的东西:
ob.deletePost = function (provider_id,post_id) {返回 $http.delete(urlBase +'/providers/' + provider_id +'/posts/' + post_id ,{标头:{授权:'承载'+auth.getToken()}});};
在控制器中:
$scope.deletePost= function (provider_id,post_id) {//console.log('PROVIDER',provider_id);//console.log('POST',post_id);//console.log('COMMENT',comment_id);provider.deletePost(provider_id,post_id).成功(功能(){$scope.status = '已删除帖子!正在刷新帖子列表.';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);如果(post._id === post_id){//console.log(provider._id === provider_id)//console.log(provider._id);$scope.provider.posts.splice(i, 1);//providers.getAllComments();休息;}}//$scope.providers = null;//我也不知道如何写评论?}).错误(功能(错误){$scope.status = '无法删除评论:' + error.message;});};
这是我观点的一部分:
<!-- |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}} 帖子 </a><button class="btn btn-xs btn-info pull-right" ng-click="modalUpdateProvider('size',provider)">编辑</button></span>从不更新provider.posts.length.要观看提供商和帖子视图,您可以查看以下link.谢谢.
解决方案 我相信您在更新语句中使用了错误的模型:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {console.log("我从服务器运行");//注意:您还可以包含一个 where 子句以确保//提供者 ID 也匹配.这将阻止某人使用任何//提供者 ID(包括一个不存在的 ID)和一个帖子 ID.返回 Post.findById(req.params.post, function(err, post) {//可能想在这里检查错误console.log('帖子删除');返回 post.remove(function(err) {如果(!错误){//后更新({Provider.update({_id: post.provider//或 req.params.provider}, {$拉:{帖子:post._id}},函数(错误,数量受影响){console.log(numberAffected);如果(!错误){console.log('removed post id');} 别的 {控制台日志(错误);}返回 res.send('');});} 别的 {控制台日志(错误);}});});});
此外,您可以使用 findByIdAndXXX 方法以及内置的 promise 将它们链接在一起以提高可读性:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {console.log("我从服务器运行");//注意:您还可以包含一个 where 子句以确保//提供者 ID 也匹配.这将阻止某人使用任何//提供者 ID(包括一个不存在的 ID)和一个帖子 ID.返回 Post.findByIdAndRemove(req.params.post).exec().then(function(post) {console.log('帖子删除');返回 Provider.findByIdAndUpdate(req.params.provider, {$拉:{帖子:post._id}}, {新:真实}//返回更新的文档).exec();//返回要为下一个处理程序评估的承诺}).then(函数(提供者){console.log('removed post id');res.send('');}).then(null, function(err) {控制台日志(错误);//可能想在这里发送响应错误});});
更新:要使用 where 子句,您需要切换到 findOneAndXXX 方法:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {console.log("我正在从服务器运行");return Post.findOneAndRemove({_id: req.params.post, provider_id: req.params.provider}).exec().then(function(post) {console.log('帖子删除');返回 Provider.findByIdAndUpdate(req.params.provider, {$拉:{帖子:post._id//或 req.params.post}}, {新:真实}//返回更新的文档).exec();//返回要为下一个处理程序评估的承诺}).then(函数(提供者){console.log('removed post id');res.send('');}).then(null, function(err) {控制台日志(错误);//可能想在这里发送响应错误});});
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 :
/providers/553b72c9f6d0020425d37f37/posts
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);
});
});
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()}
});
};
And in controller:
$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>
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);
}
});
});
});
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
});
});
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屋!
查看全文