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
找到自己的路。以下是myUserController
的摘录,当用户使用适当的令牌访问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'););
});
},
不一定更短,但更干燥。那很酷,而且肯定更干燥。我没有想到像这样使用
投掷和捕获。