在我的node.js应用程序中,我有一个ejs
表单,其中包含一些express-validator
应该验证的文本输入字段,一个使用**multer
的image文件,以及一个包含CSRF
令牌的隐藏输入(我在应用程序的所有其他表单中也有这个令牌)。
问题是,CSRF
中间件是全局的**,并且在我的路由文件中的中间件之前为每个请求运行,而multer
中间件在其中一个路由文件中运行。
我知道multer
应该放在CSRF
中间件之前**,但是在我的例子中,我必须把multer
放在路由之内--因为我希望它在express-validator
完成文本输入验证之后运行。
为什么我希望multer
在express-validator
之前运行,而不能使其全局化?
因为如果我把multer设置为全局的,那么如果我的表单中有一个valid文件,即使文本输入是invalid-**文件仍然会被multer上传,因为multer在express-validator开始运行之前就已经运行了,这是一个大问题。
为了解决这个问题,我将multer
中间件放在路由器内部和验证器之后,但是现在csrf
出现了需要multer的问题。
下面是我的部分代码:
多路中间件:
const fileStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "images");
},
filename: (req, file, cb) => {
cb(null, uuidv4() + "-" + file.originalname);
},
});
const fileFilter = (req, file, cb) => {
if (file.mimetype === "image/jpeg" || file.mimetype === "image/jpg" || file.mimetype === "image/png") {
cb(null, true);
} else {
cb(null, false);
}
};
module.exports = multer({ dest: "images", storage: fileStorage, fileFilter:fileFilter}).single("image");
包含multer和express-validator的路线文件:
const { productValidators } = require('../middleware/validators')//The express validator middlewares
const multer = require('../middleware/multer')
router.post("/add-product",isAuth,productValidators,multer,adminController.postAddProduct);
router.post("/edit-product",isAuth, productValidators,multer, adminController.postEditProduct);
简而言之,我的问题是,如果其他验证失败,我需要multer停止上传图像,但唯一的方法是在express-validator
之后添加multer
中间件,而不是使其成为全局中间件,这会导致csrf
问题。
有没有别的办法?
谢谢你的帮助。
1条答案
按热度按时间cczfrluj1#
中间件使用快速接收方法req:Request,res:Response,next:NextFunction.主要已验证中间件,如果不允许,则返回res.status(401).json({消息:'错误标识键' })