Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何重构Model.findOne(…;)块以使其更具前景(SailsJS 0.9.x)_Javascript_Callback_Controller_Promise_Sails.js - Fatal编程技术网

Javascript 如何重构Model.findOne(…;)块以使其更具前景(SailsJS 0.9.x)

Javascript 如何重构Model.findOne(…;)块以使其更具前景(SailsJS 0.9.x),javascript,callback,controller,promise,sails.js,Javascript,Callback,Controller,Promise,Sails.js,我仍然在用Node.js和最近的Sails.js找到自己的路。以下是myUserController的摘录,当用户使用适当的令牌访问URL时,该摘录会验证用户的电子邮件。这是可行的,但有点可怕,我相信有更好的方法 verifyEmailWithToken: function(req, res){ if (req.isJson) { return res.json({error: 'Invalid request. You must get here via a standard we

我仍然在用
Node.js
和最近的
Sails.js
找到自己的路。以下是my
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');
      });
    }
  });
},
verifyEmailWithToken:函数(请求、回复){
if(req.isJson){
返回res.json({error:'Invalid request.您必须通过标准web浏览器'},405)到达这里);
}
var token=req.params.token;
User.findOne({verificationToken:token}).exec(函数(err,User){
如果(错误){
sails.log.error('捕获错误',err);
req.flash.danger={title:'数据库错误!',
消息:“抱歉,内部数据库错误阻止了此请求的发生。”;
物质状态(500);
返回res.view(“主页/已验证”);
}如果(!user),则为else{
sails.log.error('invalid token',token');
req.flash.danger={title:'无效令牌!',消息:'提供的令牌无效。'};
物质状态(401);
返回res.view(“主页/已验证”);
}否则{
user.resetAuthenticationToken();
user.emailAuthenticated=true;
user.save(函数(err){
如果(错误){
sails.log.error('保存时出错',err);
req.flash.danger={title:'Error!',消息:“保存用户时出错”};
物质状态(500);
}否则{
req.flash.success={title:'Verified!',消息:“电子邮件地址”+
user.email+“已验证。”};
}
返回res.view(“主页/已验证”);
});
}
});
},

我被告知要利用
承诺
,但我还没有找到任何像样的例子来说明我可以如何做到这一点。我应该如何重构它,使之干燥,并充分利用它的优点呢?你可以去掉一点逻辑,最后只在一个地方完成所有的输出

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'););
  });
},
verifyEmailWithToken:函数(请求、回复){
if(req.isJson){
返回res.json({error:'Invalid request.您必须通过标准web浏览器'},405)到达这里);
}
var token=req.params.token;
User.findOne({verificationToken:token}).exec().catch(函数(err){
扔{
呃:呃,,
日志:“捕获错误”,
flash:{title:'Database error!',消息:“抱歉,内部数据库错误阻止了此请求的发生。”;
现状:500
};
}).then(功能(用户){
如果(!用户){
扔{
日志:“无效令牌”+令牌,
flash:{title:'Invalid token!',消息:“提供的令牌无效”。};
现状:401;
}否则{
返回用户;
}
}).then(功能(用户){
user.resetAuthenticationToken();
user.emailAuthenticated=true;
返回user.save().then(函数()){
返回{title:'Verified!',消息:“电子邮件地址”+
user.email+“已验证。”};
},函数(err){
扔{
呃:呃,,
日志:“保存时出错”,
flash:{title:'Error!',消息:“保存用户时出错”};
现状:500
};
});
}).然后(函数(结果){
req.flash.success=结果;
},功能(e){
sails.log.error(e.log,e.err);
req.flash.danger=e.flash;
物质状态(即物质状态);
}).最后(函数(){
返回res.view('home/verified'););
});
},

不一定更短,但更干燥。

那很酷,而且肯定更干燥。我没有想到像这样使用
投掷
捕获