首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对node-postgres使用Async/Await

对node-postgres使用Async/Await
EN

Stack Overflow用户
提问于 2018-12-24 16:13:20
回答 1查看 13.1K关注 0票数 9

我正在使用node-postgres查询我的数据库,我想知道如何使用async/await并正确处理错误

我使用的一个示例是一个非常简单的查询

代码语言:javascript
复制
const { Pool } = require('pg');

let config;
if (process.env.NODE_ENV === 'production' || process.env.NODE_ENV === 'staging') {
  config = { connectionString: process.env.DATABASE_URL, ssl: true };
} else {
  config = {
    host: 'localhost',
    user: 'myuser',
    database: 'mydatabase',
  };
}

const pool = new Pool(config);

async function getAllUsers() {
  let response;
  try {
    response = await pool.query('select * FROM users');
  } catch (error) {
    throw error;
  }
  return response.rows;
}

然后在我的routes.js中,我有

代码语言:javascript
复制
app.get('/all_users', async (req, res) => {
  const users = await queries.getAllUsers();
  console.log(users); // returns all users fine
});

到目前为止,这是我的理解,但我认为我没有正确地处理这个问题,因为当涉及到错误时,我的应用程序将冻结并抛出UnhandledPromiseRejectionWarning。例如,如果我提供了一个不正确的表

代码语言:javascript
复制
async function getAllUsers() {
  let response;
  try {
    response = await pool.query('select * FROM notable');
  } catch (error) {
    throw error;
  }
  return response.rows;
}

UnhandledPromiseRejectionWarning: error: relation "notable" does not exist

应用程序将在30秒后崩溃,我没有很好地处理这个错误

谁能指出我这里漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-24 16:19:33

async函数或Promise引发未捕获的错误时,或者当捕获器也抛出错误时,例如使用您的

代码语言:javascript
复制
throw error;

这意味着函数的调用者将面临一个被拒绝的承诺来处理。如果您在调用方中使用await,那么您还必须在调用方中使用try/catch,以便正确地捕获错误:

代码语言:javascript
复制
app.get('/all_users', async (req, res) => {
  try {
    const users = await queries.getAllUsers();
    console.log(users);
  } catch(e) {
    // handle errors
  }
});

解决错误而不必在使用者中使用try/catch的另一种方法是不在catchthrow错误

代码语言:javascript
复制
async function getAllUsers() {
  let response;
  try {
    response = await pool.query('select * FROM users');
    return response.rows;
  } catch (error) {
    // handle error
    // do not throw anything
  }
}

但这将使消费者更难知道何时出现错误。

在这种特殊情况下,async/await/try/catch结构添加了很多语法噪声,但没有带来太多好处-目前,您可以考虑使用简单的Promise:

代码语言:javascript
复制
const getAllUsers = () => pool.query('select * FROM users')
  .then(response => response.rows);

// and:
app.get('/all_users', (req, res) => {
  queries.getAllUsers()
    .then((users) => {
      console.log(users);
    })
    .catch((err) => {
      // handle errors
    });
});

当你想让你的代码看起来更平坦一些.then时,asyncawait就会大放异彩。如果只有一个.then,那么将其转换为async/await语法没有太大的好处。当然,这取决于你。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53910835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档