import { createConnection } from 'MysqL';
import { promisify } from 'util';
export default class Database {
static instance: Database;
query;
db;
constructor(user, password, database, host) {
Database.instance = this;
this.db = createConnection({ user, password, database, host });
this.db.connect();
this.query = promisify(this.db.query);
}
async getUser(id: number, filter: string = null) {
return this.query('SELECT * FROM users WHERE id = ' + id)
.then((err, res, fields) => {
return res[0];
});
}
}
以及将ID传递给getUser的快速路由.
执行此代码后,我得到了这个堆栈.
(node:16544) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:16544) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'typeCast' of undefined
at Database.query (<project>\node_modules\MysqL\lib\Connection.js:199:34)
at Database.query (internal/util.js:232:30)
at Database.getUser (<project>\lib\structures\Database.js:13:21)
at get (<project>\lib\api\routes\user.js:5:33)
at Layer.handle [as handle_request] (<project>\node_modules\express\lib\router\layer.js:95:5)
at next (<project>\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (<project>\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (<project>\node_modules\express\lib\router\layer.js:95:5)
at <project>\node_modules\express\lib\router\index.js:281:22
at param (<project>\node_modules\express\lib\router\index.js:354:14)
(node:16544) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 6)
我该如何解决?
解决方法:
Promisify(…)返回一个承诺.因此,您应该像这样使用await:await Promisify(…)
解决方案是:
1)删除this.query = promisify(…)和this.db.connect();构造函数中的代码行
export default class Database {
static instance: Database;
static async getInstance(user?, password?, database?, host?) {
// all arguments above are optional
if(!Database.instance){
const connection = createConnection({ user, password, database, host });
await connection.connect();
const dbQuery = await promisify(this.promisify(connection.query));
Database.instance = {
query: dbQuery
}
return Database.instance;
}
return Database.instance;
}
static getUser(id: number, filter: string = null) {
return Database.instance.query('SELECT * FROM users WHERE id = ' + id)
.then((err, res, fields) => {
return res[0];
});
}
}
使用方法:
然后,在任何需要的地方:
async getUser(){
let database = await Database.getInstance(); // or Database.getInstance(user, password ...) to first initialize and then get the instance.
return database.getUser(1234, filter);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。