【发布时间】:2017-04-02 10:03:35
【问题描述】:
在后端 API 中,我有一个登录路由,应该执行以下操作序列:
给定用户名和密码,尝试根据 Active Directory 对用户进行身份验证。如果身份验证失败,回复状态 401。如果成功,继续。
在数据库中查找具有给定用户名的用户。如果未找到状态为 403 的回复,否则继续。
查找用户文档是否包含一些详细信息,例如电子邮件、显示名称等(以防这不是第一次登录)。如果是,则使用用户对象回复,否则继续。
从 Active Directory 中获取用户详细信息并更新数据库中的用户对象。回复更新的对象。
代码:
router.post('/login', (req, res, next) => {
// capture credentials
const username = req.body.username;
const password = req.body.password;
let user = null;
// authenticate
ad.authenticate(username, password)
.then((success) => {
if (!success) {
res.status(401).send(); // authentication failed
next();
}
return User.findOne({ username }).exec();
})
.then((found) => {
if (!found) {
res.status(403).send(); // unauthorized, no account in DB
next();
}
user = found;
if (user.displayName) {
res.status(201).json(user); // all good, return user details
next();
}
// fetch user details from the AD
return ad.getUserDetails(username, password);
})
.then((details) => {
// update user object with the response details and save
// ...
return user.save();
})
.then((update) => {
res.status(201).json(update); // all good, return user object
next();
})
.catch(err => next(err));
});
现在我用回调来运行它,但它确实是嵌套的。所以我想尝试一下 Bluebird 的 promise,但是我有两个问题:
看起来很混乱,有没有更好的方法来链接调用和处理响应?
每当我在回复后调用
next()停止请求时,都会继续执行到另一个.then()。尽管客户端收到了正确的响应,但在服务器日志中我发现执行仍在继续。例如,如果数据库中没有给定用户的帐户,客户端会收到403响应,但在服务器日志中我看到异常failed to read property displayName of null,因为没有用户,它应该在@987654326 中停止@ 在res.status(403).send();之后。
【问题讨论】:
-
我目前使用的是最新的node版本7,并且开启了
--harmony-async-await,然后你可以使用async/await模式,真的可以整理代码。 -
你必须
return next()
标签: javascript node.js express promise bluebird