如何使用快速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错误部分。
- 保存第一次login历史logging后,ExpressJS应用login失败
- Node.js /socket.io/socket.io.js找不到4.0
- 5个请求后,node.js http.get挂起到远程站点
- 使用mongolab,nodejs和express提高AngularJS web应用程序的响应时间
- 刷新浏览器后,包含“hypen”的URL不会经过angular度$ routeProvider.when(),而直接请求服务器
- 如何编写一个节点快递应用程序,服务大多数本地文件,但重新路由到另一个域?
- 如何在node.js http.request中发布XML数据
- 如何通过Angular,Express和Mongoose执行请求放置?
- 如何与Socket.IO 1.x和Express 4.x共享会话?