Использование Async / Await с node-postgres - PullRequest
0 голосов
/ 24 декабря 2018

Я использую node-postgres для запроса к моей базе данных и хотел бы знать, как использовать async / await и правильно обрабатывать ошибки

Пример моего использования здесь с очень простым запросом

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 у меня есть

app.get('/all_users', async (req, res) => {
  const users = await queries.getAllUsers();
  console.log(users); // returns all users fine
});

Это мое понимание до сих пор, но я не думаю, что я подхожу к этому правильно, так как, когда дело доходит до ошибок, мое приложение зависнети бросить UnhandledPromiseRejectionWarning.Поэтому, если я предоставлю неверную таблицу, например,

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 секунд, и я не обработал эту ошибку изящно

Может ли кто-нибудь указать, что мне здесь не хватает, пожалуйста?

1 Ответ

0 голосов
/ 24 декабря 2018

Когда функция async или Promise выдает неперехваченную ошибку, или когда перехватчик также выбрасывает, например, с вашим

throw error;

, это означает, что Абонент функции будет сталкиваться с отклоненным Обещанием.Если вы используете await в вызывающем абоненте, то вам также нужно будет использовать try/catch в вызывающем абоненте, чтобы правильно отследить ошибки:

app.get('/all_users', async (req, res) => {
  try {
    const users = await queries.getAllUsers();
    console.log(users);
  } catch(e) {
    // handle errors
  }
});

Другой способ устранить ошибку безнеобходимость использования try/catch в потребителе не будет throw ошибкой в ​​вашем catch:

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 добавляют много синтаксического шума без особой пользы для IMO - на данный момент вы можете вместо этого использовать обычные обещания:

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
    });
});

async и await светятся, когда у вас есть несколько .then с, которые вы хотели бы выглядеть более плоскими в вашем коде.Если есть только один .then, IMO, нет особого преимущества в преобразовании его в синтаксис async / await.Конечно, решать только вам.

...