javascript - 如何重构 Model.findOne(…) block 以使其更有前途 (SailsJS 0.9.x)

标签 javascript callback controller promise sails.js

我仍在寻找使用 Node.js 以及最近的 Sails.js 的方法。以下是我的 UserController 的摘录,当用户访问带有适当 token 的 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');
      });
    }
  });
},

我被告知要利用 promise ,但我还没有找到任何合适的例子来说明如何做到这一点。我应该如何重构它以干燥它并利用 promise

最佳答案

您可以取消一些逻辑的嵌套,并最终仅在一个位置执行所有这些输出。

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'););
  });
},

不一定更短,但更干燥。

关于javascript - 如何重构 Model.findOne(…) block 以使其更有前途 (SailsJS 0.9.x),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23620776/

相关文章:

javascript - Angularjs 的 $http.get 在 IE11 中只执行一次

javascript - 合并具有相同 id 的数组

javascript - 如何禁用 IE 中图像的图像工具栏?

node.js - 初学者 Node.js 回调示例

javascript - 我们可以从 WebService 调用 javascript 函数吗?

callback - ZMQ 通知订阅

c++ - 如何为将回调作为参数的函数编写单元测试?

php - CodeIgniter 表单上的 XSS 过滤

javascript - Node 应用程序中的 MVC Controller ,这些是 Controller 吗?

ruby-on-rails - 在 Rails 中,有什么方法可以在 Controller 和 View 中使用 app/helpers/foo.rb 方法?