在 NodeJS / Express(&multer)附件上传实用程序中,如何处理 API 删除请求?

In a NodeJS / Express (& multer) attachment upload utility, how to handle API delete requests?

下面是一个基本的文件上传实用程序。它可以令人满意地处理 React / Axios API POST。文件被上传到服务器根目录下的 ~uploads 文件夹。如何向它添加 API DELETE 处理能力?设想一个用例,其中用户将附件上传到博客 post,然后从博客 post 中删除附件。在查找示例时遇到问题。

var cors = require('cors');
var express = require('express');
var multer = require('multer')

var app = express();
app.use(cors());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

var storage = multer.diskStorage(
{
    destination: function (req, file, cb)
    {
        cb(null, 'fileuploads');
    },
    filename: function (req, file, cb)
    {
        cb(null, file.originalname );
    }
})

var upload = multer({ storage: storage }).array('file')

app.post('/upload',function(req, res)
{
    upload(req, res, function (err) 
    {
        if (err instanceof multer.MulterError)
        {
            return res.status(500).json(err)
        }
        else if (err)
        {
            return res.status(500).json(err)
        }
        return res.status(200).send(req.file)
    })
});

app.listen(8001, function() {

    console.log('App running on port 8001');

});

编辑:

app.delete(...) 修改为以下内容,成功删除文件但大约一分钟后在控制台中抛出此错误:[Error: ENOENT: no such file or directory, unlink '<PATH VALUE>']

app.delete('/writer/:file_to_delete', async (req, res) =>
{
    const path = 'assets/uploads/' + req.params.targetFile;

    console.log(path);

    try
    {
        fs.unlink(path)
        // NOTE: `fs.unlinkSync(path)` does the same thing
        console.log('File deleted!');

        return res.status(200);
    }
    catch(err)
    {
        console.error(err)
        return res.status(500).json(err)
    }
});

我找到了前进的方向。代码在下面,但我很高兴听到更好的方法:

// NOTE: `file_name` values are obfuscated and uniquely generated by the client.
// The actual file name is in data storage.
app.post('/delete/:file_name', (req, res) =>
{
    const theFile = 'attachments/' + req.params.file_name;

    var resultHandler = function(err) { 
        if(err) {
           console.log("file delete failed", err);
           return res.status(500).json(err)
        }
        console.log("file deleted");
        return res.status(200).send({data: req.params.file_name + ' deleted'});
    }
    
    fs.unlinkSync(theFile, resultHandler);
});