2016-07-11 21 views
0

我的nodejs應用程序接受來自具有由快速中間件強制執行的權限的用戶的文件上載,並且它使用multer如何使用Mulder清理臨時文件

典型航線驗證,檢查用戶是否被允許,那麼做進口,例如:

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

如果沒有錯誤,這個偉大工程,並導入功能刪除文件。但是如果出現錯誤(如無效或不允許的用戶),則會創建上傳的文件並保留在磁盤上。

我想不在磁盤上創建任何文件,直到所有權限中間件都成功運行。我已經使用鏈multer非常結束嘗試,即:

var app = express(); 

app.use(// ... 

app.use(passport.initialize()); 
app.use(multer({dest:'./tmp/'}).single('file')); 

但一個auth錯誤,我還是最終在TMP文件。

如何避免在所有其他中間件通過之前在磁盤上創建文件?

如果這是不可能的,我可以添加一箇中間件函數,該函數僅在存在文件附件且上游存在錯誤時才運行?

回答

2

移動您的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` 
}); 
+0

這樣做了。謝謝!我忘記了那些路由器方法真的只是中間件鏈的終點。 – user1272965

0

您還可以使用的cron和「FS」模塊的組合做定期這個任務。你只需要把這個代碼放在app.js中。 我必須定期刪除所有臨時文件和文件夾。

var fs = require('fs'); 
var CronJob = require('cron').CronJob; 
var temp_folder_path = path.join(__dirname, 'public', 'uploads'); 

    /* 
     Seconds: 0-59 
     Minutes: 0-59 
     Hours: 0-23 
     Day of Month: 1-31 
     Months: 0-11 
     Day of Week: 0-6 // 0 = Sunday 
     * cronjob for deleting temp files from public/upload folders 
     * this cronjob runs from Monday through Friday at midnight 12:00 
    */ 
    new CronJob('00 00 00 * * 1-5', function() { 
    console.log('deleting all temporary file from public/uploads/*'); 
    deleteFolderRecursive(temp_folder_path) 
}, null, true, 'America/Los_Angeles'); 


// Used for deleting all files and sub-folders from 'public/upload/*' 
// Multer : stores temporary files in this folder 
var deleteFolderRecursive = function (path) { 
    if (fs.existsSync(path)) { 
     fs.readdirSync(path).forEach(function (file, index) { 
      var curPath = path + "/" + file; 
      if (fs.lstatSync(curPath).isDirectory()) { // recurse 
       deleteFolderRecursive(curPath); 
       fs.rmdirSync(curPath); 
      } else { // delete file 
       fs.unlinkSync(curPath); 
      } 
     }); 
    } 
}; 
相關問題