首页 > 解决方案 > 与路由中的回调作斗争 - NodeJS

问题描述

在我的 nodejs 后端中,我有一条删除产品的路线。因为用户可以上传与产品相关的图片,所以相应的图片也需要删除。但我正在努力做到这一点。

我的节点:

productRoutes.route('/delete/:id').get(function (req, res) {
    const id = req.params.id;
    Product.find({_id: id}).select('name').exec().then(product => {
        var name = product[0].name;
        rimraf('uploads/imgs/' + name, function () {
            console.log('uploads/imgs/' + name + ' deleted');
        });
    });
    Product.remove({_id: id})
        .exec()
        .then(result => {
            res.status(200).json(result);
        })
        .catch(err => {
            res.status(500).json({
                error: err
            });
        });
});

我首先搜索必须删除的产品名称。然后我用 rimraf 删除它的文件夹。

然后必须删除该产品。现在我知道我做错了,因为 NodeJS 的异步性。由于 NodeJS 是异步工作的,所以会出现 name 变量未定义的错误。

但我真的很难以正确的方式做到这一点。你们能帮忙吗?

标签: node.jsasynchronous

解决方案


如果您使用findOneAndRemove将文档查找和删除合并到一个步骤中的方法,这会更容易:

productRoutes.route('/delete/:id').get(function (req, res) {
    const id = req.params.id;
    Product.findOneAndRemove({_id: id}, {select: 'name'}, (err, doc, result) => {
        if (err) {
            res.status(500).json({
                error: err
            });        
        }
        else if (doc) {
            rimraf('uploads/imgs/'+ name, function(){
                console.log('uploads/imgs/'+name + ' deleted');
                res.status(200).json(result);
            });    
        }
        else {
            // Don't forget to handle the "id not found" case
            res.send(404);
        }
    });
});

推荐阅读