【问题标题】:Form validation and Node JS - avoiding pyramid of doom表单验证和 Node JS - 避免厄运金字塔
【发布时间】:2023-03-04 01:11:01
【问题描述】:

我是 Node 新手,正在尝试进行一些用户注册表单验证。如果可能,我想重构以下代码以摆脱金字塔。我在 userService 模块中使用 Express Validator 来检查空字段和电子邮件验证,但 isValueUnique 函数只是一个 Mongoose findOne 查询。我使用 Graphics Magick 来调整图像大小。欢迎提出任何建议:

router.post('/register', function(req, res, next){
  userCheck = userService.checkRegistration(req)
  if(userCheck.errors){
    return res.render('user/register', { 
      errors: userCheck.errors,
      message: req.flash('error'),
      title: 'People Power | Register'
    })
  }
  User.isValueUnique({username: req.body.username}, function(err, user){
    if(user){
      return res.render('user/register', { message: 'Username already taken. Please choose another.', title: 'People Power | Register' });  
    }else{
      User.isValueUnique({ email: req.body.email }, function(err, user){
        if(user){
          return res.render('user/register', { message: 'Email already registered. Please try again.', title: 'People Power | Register' }); 
        } else{
          User.createUser(userCheck, function(err, user){
            if(err) throw err;
            userService.resizeImage(userCheck, function(){
              req.login(user, function(err){
                req.flash('success', 'You have registered successfully, and are now logged in!')
                res.redirect('/')
              })
            });
          });
        }             
      })
    }   
  })             
});

【问题讨论】:

    标签: javascript node.js mongodb asynchronous mongoose


    【解决方案1】:

    您可以使用async#waterfall 来改进“回调地狱”,因此您的代码可能如下所示:

    async.waterfall([
    
        function (callback) {
            User.isValueUnique({username: req.body.username}, callback);
        },
    
        function (user, callback) {
            if (user) {
                return res.render('user/register', { message: 'Username already taken. Please choose another.', title: 'People Power | Register' });  
            }  
            User.isValueUnique({ email: req.body.email}, callback); 
        }
    
        function (user, callback) {
            if (user) {
                return res.render('user/register', { message: 'Email already registered. Please try again.', title: 'People Power | Register'};   
            }
            User.createUser(userCheck, callback);
        },
    
        function (user, callback) {            
            userService.resizeImage(userCheck, callback);            
        },
    
        function (callback) {
            req.login(user, function(err) {
                req.flash('success', 'You have registered successfully, and are now logged in!')
                    res.redirect('/')
                });   
            } 
    ], function (err) {
        if (err) throw err;
    });
    

    我还建议查看PassportJS 模块,该模块已经具有用于实现用户注册功能的模式套件。

    【讨论】:

    • 非常感谢。我很喜欢。我看过 PassportJS,但看不到对用户名和密码以外的字段进行验证的方法,也看不到验证电子邮件、空字段等的明显方法。你知道使用护照的任何例子吗?我看过的示例教程?
    • 是的,当然。有很多例子。我可能会建议你这个教程scotch.io/tutorials/easy-node-authentication-setup-and-local
    • 回调函数是异步原生的还是我们需要定义一个自定义的?
    • 回调函数类似于express中间件中的next函数。您应该在部分任务完成后切换下一个任务。
    • 在本教程中 github.com/caolan/async#waterfall 他们手动执行它,但在您的代码中它由 isValueUnique 执行,例如
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 2016-10-14
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多