如何使用 multer 清理临时文件

use*_*965 4 node.js express multer passport.js

我的 Nodejs 应用程序接受由快速中间件强制执行的用户上传的文件,并且它使用multer

典型的路由进行身份验证,检查用户是否被允许,然后进行导入,例如:

router.post('/:id/import', passport.authenticate('jwt', { session: false }), permit('admin'), function(req, res, next) {
    MyClass.doImport(req.file.path).then(function(result) {
        res.json(result);
    }).catch(function(error) {
        res.status(500).json(error);
    });
});
Run Code Online (Sandbox Code Playgroud)

当没有错误时,这非常有效,并且导入功能会删除该文件。但如果出现错误(例如无效或未经许可的用户),上传的文件将被创建并保留在磁盘上。

在所有权限中间件成功运行之前,我不想在磁盘上创建任何文件。我尝试使用 multer 作为链的最末端,即:

var app = express();

app.use( // ...

app.use(passport.initialize());
app.use(multer({dest:'./tmp/'}).single('file'));
Run Code Online (Sandbox Code Playgroud)

但在出现身份验证错误时,我仍然在 tmp 中得到一个文件。

在所有其他中间件通过之前,如何避免在磁盘上创建文件?

如果这是不可能的,我可以添加一个仅在存在文件附件且上游出现错误时运行的中间件函数吗?

msc*_*dex 5

移动您的multer中间件,使其仅在相关路由处理程序之前执行。这样,如果任何其他中间件“拒绝”该请求,您就不会留下临时文件。例如:

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated())
    return next();
  res.redirect('/');
}
var fileUpload = multer({dest:'./tmp/'}).single('file');

var app = express();
// ...
app.use(passport.initialize());
// ...
app.put('/upload', isLoggedIn, fileUpload, function(req, res) {
  // use `req.file`
});
Run Code Online (Sandbox Code Playgroud)