node.js - Pg-promise:返回查询结果的正确方法

标签 node.js express asynchronous pg-promise

我想使用 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))


如果你有像这样的三个独立函数(checkUserNamecheckEmailcheckWhateverElse),并且想要全部执行它们,这里是最好的方法:

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/

相关文章:

javascript - javascript同步函数可以并发调用吗

node.js - 如何将数据从表单加载到请求正文中

javascript - Node.js 和 MongoDB (mongoose) 中的登录表单

javascript - 收到错误 : Error parsing url: undefined when trying to run migrations with Sequelize

javascript - 使用 async/await Promise NodeJS 获取交易哈希

ajax - 如何使用 mongoose.js 合并更新文档?

javascript - 覆盖console.log(或一般的任何函数): Is there a proper way to do this?

mysql - Node js可以直接使用MySQL服务端口吗?

java - Hystrix 执行模式

scala - play - 如何用 futures 包装阻塞代码