如何检查用户是否已在express-validator中使用customValidators?

时间:2016-11-02 09:35:02

标签: node.js express mongoose

如果用户已经存在或不在自定义快速验证程序中,则返回布尔值(true或false)有问题。 到目前为止,我设法以这种方式工作:

app.use(expressValidator({
    customValidators: {
        isUsernameAvailable: function (username) {
            return User
                    .findOne({ 'username': username })
                    .then(function (user) {
                        if (user) {
                            throw new Error('User already exist')
                        }
                    }
        }
    }

我的想法是返回布尔(对应名称:isUsernameAvailable)而不是Promise或Object,但我不知道如何。

我用它来检查它:

module.exports = {
    create: (req, res) => {
        let user = req.body

        ...
        req.check('username', 'This username is already taken.').isUsernameAvailable()
        ...
    }
}

3 个答案:

答案 0 :(得分:0)

文档中有这样的内容: Asynchronous Validation

答案 1 :(得分:0)

你还没有描述你的"检查"函数将知道用户名是否重复,但我会说我无法想到一个可扩展的解决方案,它不需要访问某种形式的数据存储(数据库是最常见的) 。在Node中,这意味着涉及回调或Promise的异步调用,除非您真的想努力使其同步。

老实说,任何具有唯一性要求的多用户应用程序最终会因为您描述的检查而陷入困境,因为您的检查和创建步骤不会在单个原子事务中。

更好,更具可扩展性,只需将唯一索引应用于数据库中的字段,然后在应用程序代码中正确处理该错误。

答案 2 :(得分:0)

我花了更多时间来简化并简化代码

这是我用过的代码

router.post('/signup', [
        check('username').notEmpty().withMessage('must be not null').
            .custom((value, {req, loc, path}) => {
                return Users.findOne({
                    where: {
                        username: req.body.username,
                    }
                }).then(user => {
                    if (user) {
                        return Promise.reject('Username already in use');
                    }
                });
            })
    ], (req, res) => {
        const errors = validationResult(req);
        if (!errors.isEmpty()) {
            return res.status(422).json({errors: errors.array()});
        } else {
            // Do everything or create new user
        }

    });