我仍在寻找使用 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/