【问题标题】:remove image file from backend with node File System and MongoDB使用节点文件系统和 MongoDB 从后端删除图像文件
【发布时间】:2020-11-24 01:01:37
【问题描述】:

我需要从我的后端删除一个图像文件,该文件夹是:/uploads。当我调用函数 deleteProduct 时,它会从数据库中删除产品,但产品的图像仍在文件夹中。

deleteProduct: (req, res) => {
        let productId = req.params.id;
        Product.findById(productId, (err, res) =>{
            var imageResponse = res.image; 
            console.log(imageResponse); 
        });
        //console.log(imageResponse);
        //fs.unlink('./uploads' + imageResponse );

当我尝试在 findById 之外访问 imageResponse 时,控制台打印:“imageResponse”未定义。然后我需要用 fs 删除那个文件。我不确定我是否写了正确的取消链接功能。提前致谢。

【问题讨论】:

  • res.image 应该是一个 url 。取 url ,转换为 fs 中的路径。从 fs 路径获取 'file' 的实例,当你有文件的引用时,在其上调用 delete
  • 当我记录 imageResponse 时,我得到了产品图像的名称,然后我需要将该名称传递给文件系统取消链接功能,但我不知道如何,我无法在外部访问 imageResponse findById 函数

标签: javascript node.js mongodb fs


【解决方案1】:

对于 fs.unlink

您是否确定:

  1. 包括fs = require('fs')?
  2. 使用了 __dirname?
  3. 是否包含文件扩展名(.png、.jpg、.jpeg)?
const fs = require('fs');

fs.unlink(__dirname + '/uploads' + imageResponse + ".png", (err) => {
  if (err) throw err;
  console.log('successfully deleted file');
});

对于未定义的图像响应

您没有提供有关 Product 构造函数的信息,但我认为 Product.findById 是异步的。您可能需要使用异步函数

const fs = require('fs');

async function deleteProduct (req, res) => {
        let productId = req.params.id;
        Product.findById(productId, (err, res) =>{
            var imageResponse = res.image; 
            console.log(imageResponse);
            fs.unlink(__dirname + '/uploads' + imageResponse + ".png", (err) => {
              if (err) throw err;
              console.log('successfully deleted file');
            });
        });
}

进一步阅读: 节点文件 API:https://nodejs.org/api/fs.html 异步函数:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

【讨论】:

    【解决方案2】:

    终于可以正常工作了,文件成功从文件夹中消失了,我仍然打开寻求建议,谢谢。

    deleteProduct: (req, res) => {
            let productId = req.params.id;
            Product.findById(productId, (err, res) =>{
                if(err) return res.status(500).send({message: 'Error'});
                fs.unlink('./uploads/' + res.image, (err) => {
                    if(err) return res.status(500).send({message: 'Error'});
                })
    }); 

    【讨论】:

    • 看来你从我的回答中复制了代码,如果我的回答对你有帮助,请接受。
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 2011-06-12
    • 2013-05-04
    • 1970-01-01
    相关资源
    最近更新 更多