在nodeJ中同时使用multer、CSRF和expression-validator

6jjcrrmo  于 2022-12-18  发布在  Node.js
关注(0)|答案(1)|浏览(98)

在我的node.js应用程序中,我有一个ejs表单,其中包含一些express-validator应该验证的文本输入字段,一个使用**multerimage文件,以及一个包含CSRF令牌的隐藏输入(我在应用程序的所有其他表单中也有这个令牌)。
问题是,CSRF中间件是
全局的**,并且在我的路由文件中的中间件之前为每个请求运行,而multer中间件在其中一个路由文件中运行。
我知道multer应该放在CSRF中间件
之前**,但是在我的例子中,我必须把multer放在路由之内--因为我希望它在express-validator完成文本输入验证之后运行。

为什么我希望multerexpress-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问题。
有没有别的办法?
谢谢你的帮助。

cczfrluj

cczfrluj1#

中间件使用快速接收方法req:Request,res:Response,next:NextFunction.主要已验证中间件,如果不允许,则返回res.status(401).json({消息:'错误标识键' })

相关问题