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



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

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);
});

最新更新