【问题标题】:Why I get UnhandledPromiseRejectionWarning: Unhandled promise rejection?为什么我收到 UnhandledPromiseRejectionWarning: Unhandled Promise RejectionWarning: Unhandled Promise Rejection?
【发布时间】:2019-04-05 18:44:13
【问题描述】:

脚本一直运行,直到它尝试关闭数据库的连接,现在它给了我一个 promise 错误。

当我注释掉这一部分时,脚本运行良好,没有错误,但是当然,数据库连接永远不会关闭......

>     // .then(() => {
>     //   database.close();
>     // }, err => {
>     //   return database.close().then(() => {throw err; });
>     // })

在 Promise 链的末尾有一个 catch 块还不够吗?

我收到以下错误:

[ERROR] (node:9376) UnhandledPromiseRejectionWarning: Unhandled 承诺拒绝。此错误源于抛出内部 一个没有 catch 块的异步函数,或者通过拒绝一个承诺 .catch() 没有处理。 (拒绝编号:1) [[09:33:03.101]] [错误](节点:9376)[DEP0018] 弃用警告: 未处理的承诺拒绝已被弃用。未来,承诺 未处理的拒绝将终止 Node.js 进程 带有非零退出代码。

mysql.js

const mysql = require("mysql");

const mySQLConnectionDetails = {
  host: "localhost",
  user: "xxxx",
  password: "xxxx",
  database: "amdm",
  multipleStatements: true
};

class Database {
  constructor(config) {
    this.connection = mysql.createConnection(config);
  }
  query(sql, args) {
    return new Promise((resolve, reject) => {
      this.connection.query(sql, args, (err, rows) => {
        if (err)
          return reject(err);
        resolve(rows);
      });
    });
  }
  close() {
    return new Promise((resolve, reject) => {
      this.connection.end(err => {
        if (err)
          return reject(err);
        resolve();
      });
    });
  }
}
module.exports = { Database, mySQLConnectionDetails };

index.js

require("console-stamp")(console, "[HH:MM:ss.l]");
const express = require("express");
const router = express.Router();
const { Database, mySQLConnectionDetails} = require("../helpers/mySQL");
const { cleanseString, cleanseStringToArray, generateCountDuplication, sortValuesBykey, generateScoreArray, calculateAverage, replaceAbbreviationWithExpansion } = require("../helpers/stringFixers");

const database = new Database(mySQLConnectionDetails);


/* GET Clean original name of part and store it in database. */
router.get("/createcleanname", (req, res) => {
  let allParts = [];
  let eClassCodes = []; // here I define eClassCodes
  let abbreviationsAndExpansions = [];


  database.query("SELECT * FROM partnumbersclassified")
    .then(rows => {
      console.log(rows.length);
      allParts = rows;
      return database.query("SELECT * FROM amdm.abbreviationexpansion");
    })
    .then(rows => {
      abbreviationsAndExpansions = rows;
      return database.query("SELECT * FROM eclasstree WHERE numberofdigits = '8'");
    })
    .then(rows => {
      eClassCodes = rows; // Here I assign the values to the variable.
      const replaceAbbreviations = replaceAbbreviationWithExpansion(allParts, abbreviationsAndExpansions);
      console.log("replaceAbbreviations finished");
      const cleanseStrings = cleanseString(replaceAbbreviations, "cleanname");
      console.log("cleanseStrings finished");
      return cleanseStrings;
    })
    .then(result => {
      result.forEach(obj => {
        return database.query(`UPDATE partnumbersclassified SET cleanname = '${obj.cleanname}' WHERE itemnumber = '${obj.itemnumber}'`);
      });
      console.log("cleanname updated on all parts");
    })
    .then(() => {
      database.close();
    }, err => {
      return database.close().then(() => {throw err; });
    })
    .catch(err => {throw err;});
});

【问题讨论】:

  • 捕获并抛出错误就像根本没有捕获它
  • @Jro 好的。您对改进代码有何建议?
  • @IsakLaFleur 你为什么要在 catch 里面扔东西?
  • @divine a 遵循了作者的指示,他做到了。我对 Promise 很陌生。如果您有更好的想法,请分享。

标签: javascript mysql node.js promise


【解决方案1】:

不要在catch 中抛出错误,而是按照它的用途:处理错误。

在您的情况下,您可能只想记录错误。

.then(() => {
    database.close();
  }, err => {
    return database.close().then(() => {throw err; });
  })
  .catch(err => {
    console.log(err)
  })

在生产环境中,您可能希望使用像 Sentry 这样的错误跟踪器来记录和处理错误。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2021-07-09
    • 2019-11-02
    • 2018-06-19
    • 2020-04-05
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多