Express.js:如何将req对象传递给中间件而无需创建带有Multer的新路由

时间:2019-02-21 19:43:25

标签: javascript node.js express multer

我是Express.js和StackOverflow的新手。很抱歉,如果这是一个重复的问题。我检查了一下,但没有发现任何相关内容。

因此,我正在使用Multer + Express允许用户将图像(名为'${username}.{extension}')上传到服务器端/ uploads /文件夹。我不希望用户能够在服务器上保存多个图像(即没有“ user1.jpg”和“ user1.png”)。为此,我编写了以下中间件:

function deleteUserImage(req){
    const acceptedExtensions = ['.png', '.jpg', '.jpeg', '.tif', '.tiff', '.JPG', '.bmp'];
    acceptedExtensions.forEach(char => {
        if(fs.existsSync(`./uploads/${req.cookies.username+char}`)){
            fs.unlinkSync(`./uploads/${req.cookies.username+char}`);
        }
    })
}

然后我可以通过以下路线获得所需的功能:

app.post('/process_upload-image', (req, res, next) => { //User sends post req w/ image file
    deleteUserImage(req) //images for that user are cleared.
    next();
})

app.post('/process_upload-image', upload.single('user-image'), (req, res, next) => {
    res.redirect('/welcome'); //user is redirected after multer uploads the image.
})

但是,我想知道这是否是最佳实践,因为您最终会得到两条侦听同一URI的路由?有没有一种方法可以将req传递给deleteUserImage(),然后在一条路由中调用upload.single()...?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以在一条路径上简单地链接多个中间件。将deleteUserImage函数更改为:

function deleteUserImage(req, res, next){
   const acceptedExtensions = ['.png', '.jpg', '.jpeg', '.tif', '.tiff', '.JPG', '.bmp'];
   acceptedExtensions.forEach(char => {
       if(fs.existsSync(`./uploads/${req.cookies.username+char}`)){
           fs.unlinkSync(`./uploads/${req.cookies.username+char}`);
       }
   })

   next()
}

,然后删除第一条路线,并将第二条路线更改为:

app.post('/process_upload-image', deleteUserImage, upload.single('user-image'), (req, res, next) => {
    res.redirect('/welcome');
})