Как исправить бесконечный цикл Promise в конце client.release () в node-postgres? - PullRequest
0 голосов
/ 12 октября 2018

Вот мой код, который я пытаюсь реализовать с помощью node-postgres:

    return pool.connect().then((client) => {
        //  if (err) {
        //      throw err;
        //  }
            let updateTable = [];

            console.log('ABOUT TO RUN QUERY');

            // updateTable.executeQuery()
            return client.query(sqlString, updateTable, (error, result) => {
                console.log('RUNNING QUERY');
                if (error) {
                    throw error;
                }
                console.log('RUNNING QUERY2');
                // code
                console.log('RUNNING QUERY3');

                for (let i = 0; i < result.rows.length; i++) {
                    console.log('RUNNING QUERY4');
                    let row = result.rows[i];
                    // process data
                }
                console.log('RUNNING QUERY5');
                // write to file
                console.log('RUNNING QUERY6');

                return client.release();
            })
            .then(() => {
                console.log('CLIENT RELEASED');
                if (!fileOnly) {
                    if (optionNode != null) {

                            console.log('ABOUT TO RUN QUERY #2');

                            // statsTable.executeQuery()
                            let statResults = client.query(withStatsString, statsTable, (err, res) => {
                                if (err) {
                                    console.log(err);
                                    return err;
                                }

                                return client.release();
                            });
                        //}
                    }
                }
                return pool.end();
            })
            .then(() => {
                return reportObject;
            })
            .catch(e => {
                throw e;
            });
        })
        .catch((e) => {
            console.log(e);
            return reportObject;
        });

Когда я запускаю этот код, я вижу:

RUNNING QUERY
RUNNING QUERY2
RUNNING QUERY3
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY4
RUNNING QUERY5
RUNNING QUERY6

Однако, это никогда не достигает then, где выпущен клиент.Я распечатаю буквально перед окончанием Promise, но буду висеть бесконечно и никогда не разрешу.Как исправить цепочку Promise?

РЕДАКТИРОВАТЬ: мне удалось исправить client.query, но в index.js моя программа зависает при завершении.Это код:

ReportUtil.sendInReport('Monthly_2017_01', JSON.parse(reportRequest), 100, null)
.then(result => {
    console.log(result.status);
    console.log(result.header);
    console.log(result.data);
    return Promise.resolve();
}).finally(() => {});

После этого кода он просто зависает и программа никогда не заканчивается.Как мне избежать этой цепочки Promise?

1 Ответ

0 голосов
/ 12 октября 2018

Согласно документам по обратному вызову release :

Вы должны вызывать releaseCallback или client.release (который указывает на releaseCallback), когда вы закончите работу с клиентом,Если вы забудете освободить клиент, тогда ваше приложение быстро исчерпает доступные, незанятые клиенты в пуле и все последующие вызовы в pool.connect остановятся с ошибкой или будут зависать на неопределенное время, если для ConnectionTimeoutMills настроено значение 0.

Старайтесь не возвращать client.release (как это обещание - а это не так), а просто называть его ниже в цепочке обещаний следующим образом:

return pool.connect().then((client) => {
    let updateTable = [];

    console.log('ABOUT TO RUN QUERY');

    // updateTable.executeQuery()
    return client.query(sqlString, updateTable)
    .then(result => {
        console.log('RUNNING QUERY');
        console.log('RUNNING QUERY2');
        // code
        console.log('RUNNING QUERY3');

        for (let i = 0; i < result.rows.length; i++) {
          console.log('RUNNING QUERY4');
          let row = result.rows[i];
          // process data
        }
        console.log('RUNNING QUERY5');
        // write to file
        console.log('RUNNING QUERY6');
      })
      .then(() => {
        if (!fileOnly) {
          if (optionNode != null) {

            console.log('ABOUT TO RUN QUERY #2');

            // statsTable.executeQuery()
            let statResults = client.query(withStatsString, statsTable)
            .then(res => {

            });
          }
        }
        client.release();
        console.log('CLIENT RELEASED');
        return pool.end();
      })
      .then(() => {
        return reportObject;
      })
      .catch(e => {
        client.release();
        throw e;
      });
  })
  .catch((e) => {
    console.log(e);
    return reportObject;
  });

И для выхода из index.jsиспользуя цепочку Promise:

ReportUtil.sendInReport('Monthly_2017_01', JSON.parse(reportRequest), 100, null)
.then(result => {
    console.log(result.status);
    console.log(result.header);
    console.log(result.data);
})
.catch(e => {
    console.log(e);
})
.finally(() => {
    process.exit();
});
...