Javascript 为什么我得到未处理的PromiserEjection警告:未处理的承诺拒绝?
脚本一直运行,直到它试图关闭数据库的连接,现在它给了我一个承诺错误 当我注释掉这一部分时,脚本运行正常,没有错误,但当然,db连接从不关闭Javascript 为什么我得到未处理的PromiserEjection警告:未处理的承诺拒绝?,javascript,mysql,node.js,promise,Javascript,Mysql,Node.js,Promise,脚本一直运行,直到它试图关闭数据库的连接,现在它给了我一个承诺错误 当我注释掉这一部分时,脚本运行正常,没有错误,但当然,db连接从不关闭 > // .then(() => { > // database.close(); > // }, err => { > // return database.close().then(() => {throw err; }); > // }) 在承诺链的末端有
> // .then(() => {
> // database.close();
> // }, err => {
> // return database.close().then(() => {throw err; });
> // })
在承诺链的末端有一个捕获块还不够吗
我得到以下错误:
[错误](节点:9376)未处理PromisejectionWarning:未处理
承诺拒绝。此错误源于
没有catch块或拒绝承诺的异步函数
这不是用.catch()处理的。(拒绝id:1)
[09:33:03.101][错误](节点:9376)[DEP0018]弃用警告:
未经处理的承诺拒绝被弃用。在未来,承诺
未处理的拒绝将终止Node.js进程
使用非零退出代码
mysql.js
index.js
不要抛出错误,而是执行它的目的:处理错误 在您的情况下,您可能只想记录错误
。然后(()=>{
close()数据库;
},err=>{
返回database.close().then(()=>{throw err;});
})
.catch(错误=>{
console.log(错误)
})
在生产环境中,您可能希望使用错误跟踪器来记录和处理错误。捕获并抛出错误就像不捕获错误一样all@Jro好啊你对改进代码有什么建议?@IsakLaFleur你为什么要把鱼扔进去?@Divinal a按照作者的指示做了。我还没来得及答应。如果你有更好的想法,请分享。
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 };
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;});
});