使用 multer 中间件表达动态路由

express dynamic routing using multer middleware

出于某些原因,我需要能够动态控制快速使用的路线(即,我需要能够根据设置为活动的内容和未设置的内容动态启用和禁用 URLs/paths ). 这就是为什么 express 只添加了 1 个路径:

this._express.all('*', (req, res, next) => {
            console.log(req.path);
            console.log(req.method)
            if (req.path in this._routes){
                this._routes[req.path](req, res, next);
            } else {
                res.sendStatus(404);
            }
        });

但是,我有一个上传表单来向服务器发送文件,正常使用multer的方式如下:


let upload = multer({ dest: 'uploads/' })
express.post('/upload', upload.single('file'), (req, res, next) => {
 // Do stuff and have access to req.file
});

但是,使用我当前的方法,我无法将 multer 中间件添加到动态路由中,并且我尝试在调用 /upload 时在我的自定义路由代码中调用中间件,但是,这是没有用的。有没有一种方法可以避免必须硬传递我的路由来表达并仍然使用中间件,例如 multer(以及可能通过路由添加的其他中间件)而不是 express.use()?

正如我之前所说,所有这些路由都可以 enabled/disabled/modified 通过管理面板,我宁愿不必添加实际的路由来表达并让我自己的中间件处理请求路线。

您可以在需要时动态调用 multer,方法是首先创建中间件函数:

const uploadSingle = upload.single('file'); 

然后在任何路由中,您可以有条件地调用它:

uploadSingle(req, res, next)

如果您想在完成时了解自己,请传递您自己的回调而不是 next,它会在完成时调用您的回调。中间件不必在 Express 中注册,因此它可以被 Express 自动调用,当您希望它对给定的操作执行操作时,您可以使用自己的代码调用它(只需从请求处理程序中手动传递正确的参数)要求。这给了你完全的条件控制。