如何使用快速validation器注册时validation用户名

我正在使用express / node为validation/授权创build后端api,并使用mongodb存储数据。

我正在使用express-validator来validationinput请求。 我想validation一个用户名是否已经存在 – 库build议我应该使用一个asynchronous函数来做到这一点。

虽然它在邮差中返回了正确的错误信息,但是我的服务器崩溃了。

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

Server.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); }); }); } } })); 

auth.route.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; 

auth.middleware.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()用于asynchronous未映射错误。 在这一刻,你正在使用两个 – 他们都在运行,并试图发送一个响应(这就是为什么你得到的消息: can't set headers after they are sent

有关更多信息,请参阅自述文件中的validation错误部分。