繁体   English   中英

如何将Model.findOne(…)块重构为更加有希望的(SailsJS 0.9.x)

[英]How to refactor a Model.findOne(…) chunk to be more Promisy (SailsJS 0.9.x)

我仍然可以通过Node.js和最近的Sails.js找到自己的方式。 以下是我的UserController的摘录,当用户访问带有适当令牌的URL时,它可以验证用户的电子邮件。 它可以工作,但是有点可怕,我敢肯定有更好的方法来解决它。

verifyEmailWithToken: function(req, res){
  if (req.isJson) {
    return res.json({error: 'Invalid request. You must get here via a standard web-browser'}, 405);
  }
  var token = req.params.token;

  User.findOne({verificationToken: token}).exec(function(err, user){
    if (err) {
      sails.log.error('caught error', err);
      req.flash.danger = {title: 'Database error!',
          message: 'Sorry an internal database error prevented this request from happening.'};
      res.status(500);
      return res.view('home/verified');
    } else if (!user) {
      sails.log.error('invalid token', token);
      req.flash.danger = {title: 'Invalid token!', message: 'The supplied token was invalid.'};
      res.status(401);
      return res.view('home/verified');
    } else {
      user.resetAuthenticationToken();
      user.emailAuthenticated = true;
      user.save(function(err){
        if (err) {
          sails.log.error('Error while saving', err);
          req.flash.danger = {title: 'Error!', message: 'Error while saving User'};
          res.status(500);
        } else {
          req.flash.success = {title: 'Verified!', message: 'The email address <strong>' +
                                  user.email + '</strong> has been verified.'};
        }
        return res.view('home/verified');
      });
    }
  });
},

有人告诉我要利用promises但我还没有找到任何有关如何实现promises的榜样。 我应该如何重构它以使其DRY并利用promises

您可以取消一些逻辑上的困扰,最后只在一个地方进行所有这些输出。

verifyEmailWithToken: function(req, res){
  if (req.isJson) {
    return res.json({error: 'Invalid request. You must get here via a standard web-browser'}, 405);
  }
  var token = req.params.token;

  User.findOne({verificationToken: token}).exec().catch(function(err) {
    throw {
      err: err,
      log: 'caught error',
      flash: {title: 'Database error!', message: 'Sorry an internal database error prevented this request from happening.'};
      status: 500
    };
  }).then(function(user) {
    if (!user) {
      throw {
        log: 'invalid token' + token,
        flash: {title: 'Invalid token!', message: 'The supplied token was invalid.'};
        status: 401;
    } else {
      return user;
    }
  }).then(function(user) {
    user.resetAuthenticationToken();
    user.emailAuthenticated = true;
    return user.save().then(function() {
      return {title: 'Verified!', message: 'The email address <strong>' +
                                user.email + '</strong> has been verified.'};
    }, function(err){
      throw {
        err: err,
        log: 'Error while saving',
        flash: {title: 'Error!', message: 'Error while saving User'};
        status: 500
      };
    });
  }).then(function(result) {
    req.flash.success = result;
  }, function(e) {
    sails.log.error(e.log, e.err);
    req.flash.danger = e.flash;
    res.status(e.status);
  }).finally(function() {
    return res.view('home/verified'););
  });
},

不一定较短,但较干燥。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM