AngularJS和Mongoose删除文档无法正常工作

时间:2016-08-09 18:29:01

标签: angularjs node.js mongoose

这可能不是一个完美的解决方案,但我有一个ProductModel,其中一些产品有一个指向本地存储图像的路径image01Path。当我想删除我想要的产品时,首先从本地存储中删除图像,然后尝试删除产品文档。

我的'删除'服务最初看起来像 -

app.delete('/api/product/:id', function(req, res){
    ProductModel.findOne({_id:req.params.id}).exec(function(err, product){
        if (!err){ 
            if(product.image01Path){
                fs.unlink('public/' + product.image01Path);
            }
            ProductModel.findOne({_id:req.params.id}).remove().exec().then(function successCallback(data){
                res.send(200);
            }, function errorCallback(){

            }); 
        } else {throw err;}
    });

})

由 -

调用
$scope.delete = function(product){
       $http.delete('/api/product/' + $routeParams.id).then(function successCallback(){
           $location.url('/home');
       }, function errorCallback(){

       })
   }  

我的问题是,即使我认为只有在删除文档成功时才会重定向到home,当我的家庭控制器再次打电话来获取更新的产品列表时我仍然看到已删除的产品。当我刷新页面时,我终于看到了正确的产品列表。我哪里错了?

我的家庭控制器 -

app.controller('HomeCtrl', function($rootScope, $scope, $http, $location){   
    $http.get('/api/products').then(function successCallback(products){
        $scope.products = products.data;       
    }, function errorCallback(){

    });
})

3 个答案:

答案 0 :(得分:1)

发现问题 - 我在视图中同时拥有href="#"ng-click="delete(product)"。看起来href正在将我重定向到home,在产品在后端被删除之前,正在按照上面的Home控制器调用其余的产品列表。

看看这个问题 - href overrides ng-click in Angular.js我明白应该做些什么。

答案 1 :(得分:0)

可能是因为fs也是异步的。所以你需要将一个回调传递给fs.unlink(粗略编码):

app.delete('/api/product/:id', function (req, res) {
ProductModel.findOne({ _id: req.params.id }).exec(function (err, product) {
    if (!err) {
        if (product.image01Path) {
            fs.unlink('public/' + product.image01Path, function (err) {

                if (!err) {
                    ProductModel.findOne({ _id: req.params.id }).remove().exec().then(function successCallback(data) {
                        res.send(200);
                    }, function errorCallback() {

                    });
                } else {
                    //fs.unlink failed
                }
            });
        } else {
            //Product.image not found
        }
    } else {
        //Error in finding product
        throw err;
    }
});
});

答案 2 :(得分:0)

来自fs的

unlink方法与提到的here是异步的,所以你可以选择。

使用同步取消链接:

fs.unlinkSync(path)

或者在异步取消链接中使用回调参数,因此它将是:

if(product.image01Path){
    fs.unlink('public/' + product.image01Path, function(){
        ProductModel.findOne({_id:req.params.id}).remove().exec().then(function successCallback(data){
            res.send(200);
        }, function errorCallback(){
        }); 
    });
}