我想使用 pg-promise
检查用户名是否已被使用。
我使用以下查询:
this.db.one('SELECT EXISTS(SELECT 1 FROM users WHERE username = $1)', username);
我试图将此查询封装在一个函数中,如果用户名存在则返回 true,否则返回 false。
类似于:
existsUsername(username){
this.db.one('SELECT EXISTS(SELECT 1 FROM users WHERE username = $1)', username)
.then(data => {
if(data.exists == true){
return true;
} else {
return false;
}
});
}
我可以像这样简单地使用:
if(db.users.existsUsername(username)){
// this username is already taken
}
然而,if 条件在查询完成之前被评估,导致 undefined variable 。
返回查询结果的正确方法是什么?
编辑:外部调用者执行多个异步检查并返回用户是否有效:
function signUp(username, email, ...){
// perform username existence check existsUser(username)
// perform email existence check existsEmail(username)
// ...
// if everything OK, put user in DB
}
最佳答案
最简单的方法:
existsUsername(username) {
return this.db.oneOrNone('SELECT * FROM users WHERE username = $1 LIMIT 1', username, a => !!a);
}
然后使用它:
db.users.existsUsername(username)
.then(exists => {
// exists - boolean
})
.catch(error => {
});
你不能做像 if(db.users.existsUsername(username))
这样的事情,那是把同步代码和异步代码混在一起了。但如果 ES7 语法对您可用,您可以执行 if(await db.users.existsUsername(username))
。
如果你有像这样的三个独立函数(checkUserName
、checkEmail
、checkWhateverElse
),并且想要全部执行它们,这里是最好的方法:
db.task(t => {
return t.batch([checkUserName(t), checkEmail(t), checkWhateverElse(t)]);
})
.then(data => {
// data = result of the batch operation;
})
.catch(error => {
// error
});
与 ES7 语法相同:
db.task(async t => {
const a = await checkUserName(t);
const b = await checkEmail(t);
const c = await checkWhateverElse(t);
return {a, b, c};
})
.then(data => {
// data = {a, b, c} object;
})
.catch(error => {
// error
});
注意:这些函数中的每一个都应该针对 t
- 任务上下文执行查询,以便共享连接。
关于node.js - Pg-promise:返回查询结果的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50160239/