例如,如果用户首先使用login
登录facebook
,则可以使用email+password
流,用户可以使用facebook
或user credential + user entity
进行登录在facebook [email + id]
下创建。
同一位用户可能会忘记他们使用了facebook
,并尝试创建email
登录信息。现在发生的情况是,用户必须sign in
使用facebook
帐户才能为email credential
创建新的user entity
。
Todo我有两个类,1个(login_handler.js),2个(user.js,处理所有查询)。
我的user.js
课程内有:
基本上这是做什么的,检查用户是否存在,是否存在以及userType(他们登录的帐户类型)与数据库中的accountType(email,facebook)不同。我想知道我是否应该在我的保证链(login_handler.js)中或直接在类中处理这种类型的逻辑?
checkUserExists () {
console.log ("BEFORE ERROR")
const {externalId, email, password, userType} = this;
var query;
if (this.userType == 'email')
query = `select * from content_usercredential where email = '${email}' AND secret = '${password}'`;
else if (this.userType == 'facebook'){
query = `select * from content_usercredential where email = '${email} AND externalId = '${externalId}'`;
}
return new Promise ( (fulfill, reject) => {
conn.query(query, (err, user) => {
if (user.accountType == 'facebook' && this.userType == 'email') {
// Should I handle this here, or in my login_handler promise chain?
this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off);
throw new Error ("Return confirmation object to client");
});
});
login_handler.js
我应该在这里处理并抛出错误,以便我的promise链的其余部分不会执行,或者我应该直接在错误发生的地方抛出错误(在user.js类中)。
User.checkUserExists()
.then ( () => {
// Should I handle here OR in my user.js class file?
if (User.needsToConfirm) {
this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off);
throw new Error("OR should I return the confirmation object here?"});
}
}).then( () => return createNewUserEntity())
.then( () => return createUserCredential())
答案 0 :(得分:2)
我建议你使用蓝鸟而不是原生的Promise。 (http://bluebirdjs.com/docs/getting-started.html)
请按照以下步骤操作
const Promise = require('bluebird')
return Promise.try(() => User.checkUserExists())
.then ( () => {
// Should I handle here OR in my user.js class file?
if (User.needsToConfirm) {
this.res.json("you must login with facbeook", session data here...so when they sign in we can pick up where we left off)
throw 'exit1'
}
}).then( () => return createNewUserEntity())
.then( () => return createUserCredential())
.catch(e => {
if (e === 'exit1') {
// your error
}
else {
// system error
}
})
答案 1 :(得分:2)
你的两个班级有明确的责任。 User.js
访问数据层并login_handler.js
处理登录请求和回复。
考虑将来的一段时间,您必须更换数据访问层(User.js
)或登录服务层(login_handler.js
)。更改数据层将导致重新实现响应,更改服务层将导致更改数据层,因为您必须重新实现响应。
因此,请确保您的课程始终有明确的责任和最小的共同互动。