我有一个需要multipart / form-data的表单,因为该表单中有一个文件字段。
我正在使用ExpressJS,并且使用multer处理multipart / formdata。
现在,我还需要验证标题中的字段和JWT。
在我的应用程序中,我将中间件用于应用程序/ JSON类型,并执行以下操作:
app.delete("/ticket/:ticketId", [
authValidation.validJWTNeeded,
authValidation.verifyIfNotLoggedOut,
authPermission.hasPermissionOrIsSameUser(staffRole),
ticketController.deleteById
]);
在每个中间件中,我都传递参数(req,res,next),并在需要时返回next,这样我就可以正常工作。
在没有先发送文件的情况下,我无法通过multer进行处理。 在文档中,他们将执行类似的操作,这不是我想要的,因为文件已发送:
app.post("/route",
multer.upload.single("avatar"),
function (req, res, next) {
// req.file is the `avatar` file
// req.body will hold the text fields, if there were any
})
)
我试图做这样的事情,但是没用:
app.post("/ticket", [
async (req, res, next) => {
multer.upload.none();
let jwt = //req.headers....... this is the jwt sent
//req.body should have all the fields
return next
},
authValidation.validJWTNeeded, //Here i verify the JWT for auth
authValidation.verifyIfNotLoggedOut, //About the same here
ticketController.verifyFields, // /!\ I need to verify if fields are correct
//function/middleware to upload using multer.upload.single("field"),
ticketController.insert // If everything above passed, then create the ticket and upload the file
]);
所以我的问题是:如何使用通过多部分/ formdata加密发送的multer和数据进行所有验证?
谢谢!
答案 0 :(得分:0)
所以我想出了一个办法,恕我直言,这是一种相当肮脏的方式,但是它可以工作... 我使用了multer的fileFilter,并在其中添加了所需的所有验证,包括JWT验证,字段验证等。通过执行类似的操作,如果有人有更合适的方法来执行此操作,请随时回答。
//verify the jwt here
function isLoggedIn(req) {
if (req.headers['authorization']) {
try {
let authorization = req.headers['authorization'].split(' ');
if (authorization[0] !== 'Bearer') {
return false
} else {
if(jwt.verify(authorization[1], config.jwt_secret)){
return true
}
}
} catch (err) {
return false
}
} else {
return false
}
}
//verify fields here
function verifField (req) {
console.log(req.body.title)
let fieldList = {
title : false,
message : false,
category : false,
response : false
};
if(req.body.title && req.body.title.trim() !== ""){
fieldList.title = true;
}
if(req.body.message && req.body.message.trim() !== ""){
fieldList.message = true;
}
if(req.body.category && ticketModel.ticketModel.schema.path("category").enumValues.includes(req.body.category)){
fieldList.category = true;
}
if(!req.body.response){
fieldList.response = true;
}
return fieldList.title && fieldList.message && fieldList.category && fieldList.response
}
//mix them both here + verify type
function isValid (req) {
return isLoggedIn(req) && verifField(req) && file.mimetype.match(/jpe|jpeg|png|gif$i/)
}
//export everything here
module.exports = {
upload : multer({
storage : storage,
fileFilter : (req, file, cb) => {
cb(null, isValid(req))
}
})
} ;