Где необоснованное отклонение обещания? Как я могу избежать этого? - PullRequest
0 голосов
/ 29 июня 2018

Работа с Node и mssql для извлечения запросов для пяти различных баз данных с целью устранения взаимного слияния и объединения в более унифицированную схему.

Мой процесс следует этому алгоритму:

создайте общий пул, вызвав эту функцию:

const getPoolConnection = async () => {
  try {
    let pool = await mssql.connect(`mssql://${username}:${password}@${server}/`);
    return pool;
  } catch (err) {
    console.error(err);
  }
};

Эта функция создает пул и возвращает его вызывающей функции. username, password и server импортируются и ограничиваются этим файлом.

Затем мы запрашиваем каждую базу данных и присваиваем результат свойству объекта. Это достигается с помощью цикла forEach:

lists.forEach(list => {
  fullData[list] = db.queryDatabase(pool, customers[list].query).catch(err => console.error(err));
})

которая вызывает эту функцию:

const queryDatabase = async (pool, query) => {
  try {
    let result = await pool.request().query(query);
    // console.log(result);
    return result.recordset, pool;
  } catch (err) {
    console.error(err);
  }
};

Теперь, чтобы предотвратить возникновение постобработки до того, как все вызовы базы данных вернут данные, я завернул весь набор вызовов в вызов Promise.all() в основном файле index.js. Это вызывающая функция:

const { customers } = require('./query');
const util = require('./util');
const db = require('./db');

fullData = {};

(async () => {
  let pool = await db.getPoolConnection();
  let lists = Object.keys(customers);
  Promise.all(
    lists.forEach(list => {
      fullData[list] = db.queryDatabase(pool, customers[list].query).catch(err => console.error(err));
    })
  )
    .then(results, pool => {
      console.dir(results);
      db.closePoolConnection(pool);
    })
    .catch(err => console.error(err));
})();

Что я не понимаю, так это ошибка, возникающая при попытке отладки приложения:

(узел: 18908) UnhandledPromiseRejectionWarning: TypeError: Не удается прочитать свойство 'Symbol (Symbol.iterator)' с неопределенным предупреждением.js: 18 в Function.all () в c: \ Users \ rutherfordc \ Documents \ GitHub \igration-plus \ index.js: 10: 11 в at process._tickCallback (internal / process / next_tick.js: 188: 7) (узел: 18908) UnhandledPromiseRejectionWarning: необработанное обещание отказ. Эта ошибка возникла из-за броска внутри асинхронного функционировать без блока catch или отклоняя обещание, которое было не обрабатывается с помощью .catch (). (идентификатор отклонения: 1) warning.js: 18 (узел: 18908) [DEP0018] Предупреждение об устаревании: необработанное обещание отказы устарели. В будущем обещают отклонения, которые не обрабатывается, завершит процесс Node.js с ненулевым выходом код. warning.js: 18 (узел: 18908) UnhandledPromiseRejectionWarning: ReferenceError: результаты не определены warning.js: 18 в c: \ Users \ rutherfordc \ Documents \ GitHub \igration-plus \ index.js: 15: 11 в at process._tickCallback (internal / process / next_tick.js: 188: 7) (узел: 18908) UnhandledPromiseRejectionWarning: необработанное обещание отказ. Эта ошибка возникла из-за броска внутри асинхронного функционировать без блока catch или отклоняя обещание, которое было не обрабатывается с помощью .catch (). (код отклонения: 2)

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Ошибка нелогичная, но синтаксическая, следующие строки в основной функции

.then(results, pool => {
  console.dir(results);
  db.closePoolConnection(pool);
})

Аргументы функции стрелки должны быть заключены в круглые скобки, например:

.then((results, pool) => {
  console.dir(results);
  db.closePoolConnection(pool);
})

ReferenceError: результаты не определены

Итак, then ищет переменную results, и, поскольку она является функцией async, в случае сбоя это будет UnhandledPromiseRejection.

Обновление:

Как говорит другой ответ, Promise.all получает либо несколько обещаний, либо массив обещаний, поэтому вы можете сделать что-то вроде:

var fullData = lists.map(list => db.queryDatabase(pool, customers[list].query).catch(err => console.error(err)));

Promise.all(fullData).then(...)
0 голосов
/ 29 июня 2018

Promise.all () нужен массив. Так что вы можете сделать что-то вроде этого:

fullData = [];

(async () => {
  let pool = await db.getPoolConnection();
  let lists = Object.keys(customers);
  lists.forEach(list => {
    fullData.push(db.queryDatabase(pool, customers[list].query).catch(err => console.error(err));
  }));

  Promise.all(fullData)
    .then((results, pool) => {
      console.dir(results);
      db.closePoolConnection(pool);
    })
    .catch(err => console.error(err));
})();

Обновление:

Также, как предложил Дж. Пичардо в своем ответе, в случае нескольких параметров параметры должны быть заключены в скобки.
Документация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...