Скрипт работает до тех пор, пока не попытается закрыть соединение с базой данных, а теперь выдает ошибку обещания.
Когда я комментирую этот раздел, сценарии работают без ошибок, но, конечно, соединения с БД никогда не закрываются ...
> // .then(() => {
> // database.close();
> // }, err => {
> // return database.close().then(() => {throw err; });
> // })
Разве недостаточно иметь ОДИН блок захвата в конце цепочки обещаний?
Я получаю следующую ошибку:
[ОШИБКА] (узел: 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;});
});