【问题标题】:Using PostgreSQL and Nodejs, How Do I Have My Function Return A Query?使用 PostgreSQL 和 Nodejs,我如何让我的函数返回一个查询?
【发布时间】:2020-10-18 18:06:13
【问题描述】:

我是后端开发的新手,正在学习基础知识,所以不要太担心我的代码质量。

基本上,如果您想将查询包装在抽象层中,我想了解如何将特定查询包装到从查询中返回数据的函数中。例如,在这个函数中,

  async retrieveUserOfCompany(companyName) {
    this.client.connect()
    await this.client.query("SELECT * FROM Company WHERE compname = '" + companyName + "';", (err, res) => {
      return res.rows;
      this.client.end()
    });
  }

我正在从一家公司返回一些数据。但是,当我调用该函数时,我得到查询返回未定义。我将如何解决这个问题?我已经弄清楚这是因为 db 调用是异步的,所以我尝试将 async 和 await 合并到函数中,但我不相信我完全正确。

【问题讨论】:

  • 当您想使用 Promise(和 await)时,不要将回调传递给 query。
  • 和你上一个问题一样,这仍然存在 SQL 注入安全问题。

标签: javascript node.js


【解决方案1】:

您的示例代码不完整,但看起来retrieveUserOfCompany 是一个类方法,client 是一个类属性。假设这是真的,你的函数可以这样写:

async retrieveUserOfCompany(companyName) {
    try {
        // wait for connection
        const client = await this.client.connect()
        // wait for query response
        const resp = await client.query("SELECT * FROM Company WHERE compname = '" + companyName + "';");
        return resp.rows;
    } catch(err) {
        throw(err);
    } finally {
        this.client.end();
    }
}

异步函数返回一个承诺,您最终需要将其解包。假设retrieveUserOfCompany 是MyDbClass 上的一个方法,并且您已经定义了一个名为myDb 的实例,您可以得到如下行:

myDbInstance.retrieveUserOfCompany("Foo Company")
    .then(rows => console.log(rows))
    .catch(err => console.error(err))

感谢@bergi 指出client.end() 应该在finally 子句中以确保连接已关闭。

【讨论】:

  • end 调用确实应该在 finally 子句中。
猜你喜欢
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多