如何在使用快速验证程序注册时验证用户用户名

How to validate a users username when registering using express validator

本文关键字:验证 用户 程序 注册      更新时间:2023-09-26

我正在使用express/node创建用于身份验证/授权的后端api,并使用mongodb来存储数据。

我正在使用快速验证器来验证输入请求。我想验证用户名是否已经存在 - 图书馆建议我应该使用异步函数来执行此操作。

尽管它在邮递员中返回带有正确错误消息的数据,但我的服务器因该消息而崩溃。

错误:发送标头后无法设置标头。

服务器.js

app.use(validator({
    customValidators: {
        isUsernameAvailable: function(username) {
            return new Promise(function(resolve, reject) {
                User.findOne({'username': username}, function(err, results) { 
                    if(err) {
                        return resolve(err);
                    }
                    reject(results);
                });
            });
        }
    }
}));

身份验证路由.js

var express = require('express');
var router = express.Router();
var controller = require('../controllers/auth.controller');
var middleware = require('../middleware/auth.middleware');
router.post('/login', controller.login);
router.post('/register', middleware.register, controller.register);
module.exports = router;

身份验证中间件.js

module.exports.register = function(req, res, next)
{
    req.checkBody({
        'username': {
            notEmpty: true,
            errorMessage: 'Username is required'
        },
        'email': {
            notEmpty: true,
            isEmail: {
                errorMessage: 'Invalid Email Address'
            },
            errorMessage: 'Email is required'
        },
        'password': {
            notEmpty: true,
            errorMessage: 'Password is required'
        },
        'password_confirmation': {
            notEmpty: true,
            errorMessage: 'Password Confirmation is required'
        }
    });
    req.assert('password_confirmation', 'Passwords do not match').equals(req.body.password);
    req.check('username', 'This username is already taken').isUsernameAvailable();

    var errors = req.validationErrors(true);
    if(errors) {
        return res.json({
            success: false,
            errors: errors
        });
    }
    req.asyncValidationErrors().catch(function(errors) {
        if(errors) {
            return res.json({
                success:false,
                errors: errors
            });
        };
    });

    next();
}
我认为

这是因为以下块都运行了:

var errors = req.validationErrors(true);
    if(errors) {
        return res.json({
            success: false,
            errors: errors
        });
    }
    req.asyncValidationErrors().catch(function(errors) {
        if(errors) {
            return res.json({
                success:false,
                errors: errors
            });
        };
    });

文档说您应该使用其中一个。 req.validationErrors(true); 用于同步、映射的错误,而req.asyncValidationErrors()用于异步未映射错误。目前,您正在使用两者 - 它们都在运行并尝试发送响应(这就是您收到消息的原因:can't set headers after they are sent .

有关详细信息,请参阅其自述文件中的验证错误部分。