node.js - 为什么multer应该在任何操作之前上传文件?
问题描述
Multer 在 express 之上的工作方式是有线的!为什么 Multer 应该在中间件链中的控制器之前,这在设计上会导致服务器在 DB 操作被检查之前上传东西?
例如,如果对文章进行了 post 操作,并且它包含一堆字段,其中一个是文件。
articleModel{title:String,image:String};
router.post('/', multer, articleController.createArticle);
现在在请求命中时,链中的第一件事是上传请求中的文件,但是如果在将记录执行到数据库时发生错误,例如验证甚至重复,我要更新怎么办只有文章标题?旧文件会重新上传吗?
如何使multer在http操作回调的响应中上传文件?
解决方案
在 Multer 实际处理图像之前,您确实可以制作各种东西:
var upload = multer({
dest: 'uploads/',
fileFilter: function (req, file, cb) {
// only images are allowed
var filetypes = /jpeg|jpg|png/;
var mimetype = filetypes.test(file.mimetype);
var extname = filetypes.test(path.extname(file.originalname).toLowerCase());
if (mimetype && extname) {
return cb(null, true);
}
cb("Error");
}
}).single('localImg');
app.post('/api/file', checkBody, auth, uploadFile, controller.aController);
以这段代码为例,您可以在 multer 处理您的文件之前进行各种中间件操作,但 multer 是一个处理multipart/form-data的库,而不仅仅是文件,人们主要使用 multipart 发送文件,但您可以发送各种数据,它会将它们附加到正文(req.body)
您的问题是:“为什么 multer 应该在任何操作之前上传文件?” 您可以随时执行 multer,但 multer 会处理请求并将您的数据放入正文中。除非您不需要第一手的正文数据,否则您需要 multer 在第一个中间件中。
你的另一个问题是:“如果我只更新文章标题怎么办?旧文件会重新上传吗?”
不,它会上传一次,如果数据库有任何问题,任何错误或拒绝,您可以随时使用文件系统(fs)从您的服务器中删除文件,如果您已经将文件上传到第三方系统,你可以删除它。
希望能帮助到你
推荐阅读
- angular - 如何计算角度formarray和formcontrol中的总价
- python - 无法使用 ZipFile 打开子目录中的文件
- html - 是否可以使用
- jquery - HTML:如何显示格式日期“yyyy/mm/dd hh:mm”
- php - 如何部分禁用 PHPCS 的 PSR-12 declare(strict_types=1) 检查?
- r - 创建绘图后手动调整 alpha?
- c# - C# Settings.settings 显示为 XML 而不是网格视图
- c++ - 如何构建静态boost库?
- html - 弹性中断父宽度内的表溢出
- foreach - Foreach 数组 - Neo4j