如何使用ExpressJS和multer添加JWT和字段验证

时间:2019-06-25 20:37:56

标签: node.js express multer

我有一个需要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和数据进行所有验证?

谢谢!

1 个答案:

答案 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))
        }
    })
} ;