Express.js: 如何将请求对象传递给中间件 w/o 创建一个带有 Multer 的新路由
Express.js: How to pass req object to middleware w/o creating a new route w/ Multer
我是 Express.js 和 Whosebug 的新手;如果这是一个重复的问题,我很抱歉。我检查了,但没有看到任何相关内容。
因此,我使用 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()...所有这些都在一个路径中?
谢谢!
您可以简单地将多个中间件链接到一个路由上。将 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');
})
我是 Express.js 和 Whosebug 的新手;如果这是一个重复的问题,我很抱歉。我检查了,但没有看到任何相关内容。
因此,我使用 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()...所有这些都在一个路径中?
谢谢!
您可以简单地将多个中间件链接到一个路由上。将 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');
})