在我的node.js应用程序中,我有一个
ejs
表单,其中有一些express-validator
应该验证的文本输入字段,一个使用multer
的image文件,以及一个包含
CSRF
的隐藏输入令牌。 (我的应用程序中的所有其他形式也都有此令牌)
问题是,
CSRF
中间件是全局,并且在我的路由文件中的中间件之前运行每个请求,并且multer
中间件在该路由文件之一中运行。我知道
multer
应该放在
CSRF
中间件之前,但就我而言,我必须将 multer
放在路由内 - 因为我希望它在 express-validator
完成验证文本之后运行输入。为什么我希望 multer
在
express-validator
之前运行并且无法使其全局化?
因为如果我将 multer 设置为全局,那么如果我的表单中有一个 valid文件,即使文本输入是 invalid - 该文件仍将由 multer 上传,因为 multer 已在 Express 之前运行 -验证器开始运行,这是个大问题。 为了解决这个问题,我将
multer
中间件放置在路由内部和验证器之后,但现在
csrf
存在需要 multer 的问题。这是我的代码的一部分:
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");
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 停止上传图像。但唯一的方法是在
multer
之后添加
express-validator
中间件,而不是使其成为全局中间件,这会导致 csrf
问题。有替代方案吗?
感谢您的帮助。
req:Request, res:Response, next: NextFunction
。
主要验证中间件,如果不允许:return res.status(401).json({
message: 'Error identification keys'
})