[英]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.