从中间件返回中间件

时间:2018-07-25 18:32:04

标签: node.js express express-validator

我正在使用express-validator,并且希望根据请求正文中的值进行不同的检查。

我已经为此创建了一个函数,但是我没有收到任何答复(即,表达只是挂起。):

validation / profile.js

module.exports = function (req,res,next) {
    if (req.body.type == 'teacher') {
        return check('name').exists().withMessage('Name is required'),
    } else {
        return check('student_id').exists().withMessage('Student id is required'),
    }
}

app.js

router.put('/', require('./validation/profile'), (req, res, next) => {
    const errors = validationResult(req).formatWith(errorFormatter)
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.mapped() })
    } else {
        res.send(req.user)
    }  
})

但是,如果我将我的函数编写为普通函数(而不是带有3个参数的middleware)并调用它,则一切正常。但是这样,我将无法访问请求对象。我必须对这些参数进行“硬编码”。

validation / profile.js

module.exports = function (type) {
    if (type == 'teacher') {
        return check('name').exists().withMessage('Name is required'),
    } else {
        return check('student_id').exists().withMessage('Student id is required'),
    }
}

app.js

router.put('/', require('./validation/profile')('teacher'), (req, res, next) => {
    const errors = validationResult(req).formatWith(errorFormatter)
    if (!errors.isEmpty()) {
        return res.status(422).json({ errors: errors.mapped() })
    } else {
        res.send(req.user)
    }  
})

关于如何根据请求正文中的值进行不同检查的任何建议?

1 个答案:

答案 0 :(得分:1)

express-validator check API创建了中间件,您应该将其附加为直接表达,或者像表达自己一样调用它。

// Use routers so multiple checks can be attached to them.

const teacherChecks = express.Router();
teacherChecks.use(check('name').exists().withMessage('Name is required'));

const studentChecks = express.Router();
studentChecks .use(check('student_id').exists().withMessage('Student id is required'));

module.exports = function (req,res,next) {
    if (req.body.type == 'teacher') {
        teacherChecks(req, res, next);
    } else {
        studentChecks(req, res, next);
    }
}

您还可以潜在地使用oneOf做同样的事情。

router.put('/', oneOf([
    check('name').exists().withMessage('Name is required'),
    check('student_id').exists().withMessage('Student id is required')
], 'Invalid request body'), (req, res, next) => {
    const errors = validationResult(req).formatWith(errorFormatter)
    if (
        !errors.isEmpty()
    ) {
        return res.status(422).json({errors: errors.mapped()})
    }
    else {
        res.send(req.user)
    }
});