我使用ES6来构建Node.js app类。我想创建一个db类,所以我做了以下几点:
"use strict"
var ini = require('node-ini');
var mysql = require('mysql');
let _db = new WeakMap();
// Class de base pour la base de donnée
class Db{
constructor () {
ini.parse('../config/settings.ini', function(err,data){
if(err) {
console.log(err);
return;
} else {
_db.set(this, mysql.createConnection({
host : data.database_MYSQL.host,
user : data.database_MYSQL.username,
password : data.database_MYSQL.password,
database : data.database_MYSQL.schema
}));
}
});
}
}
module.exports = Db;
这是我第一次尝试存储私有变量,我在网上寻找解决方案。我找到了我试图实现的Weakmap解决方案。但MySQL连接不会使用以下源代码存储它。我有这个输出:
_db.set(this, mysql.createConnection({
^
TypeError: Invalid value used as weak map key
at WeakMap.set (native)
at D:\supervision\application\class\db.js:15:21
at D:\supervision\application\node_modules\node-ini\node-ini.js:168:12
at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)
那么如何应对呢?
编辑:
以下是来电者如何知道它的初始化时间:
var db;
function instantiateDb(callback){
db = new db_connector();
callback(db);
}
instantiateDb(function(db){
db.connectDatabase();
})
答案 0 :(得分:0)
this
在回调中是undefined
,不指的是Db
的实例,因此您会收到该错误。看看How to access the correct `this` inside a callback?如何解决这个问题。
但是,这里存在一个更大的问题:您正在构造函数中执行异步操作。这意味着任何想要使用Db
实例的人都无法知道它何时会被完全初始化。
解决此问题的更好方法是使用静态异步方法返回Db
的新的完全初始化的实例:
class Db {
static get() {
return new Promise((resolve, reject) => {
ini.parse('../config/settings.ini', function(err,data){
if (err) {
reject(err);
} else {
resolve(new Db(data));
}
});
});
}
constructor (data) {
_db.set(this, mysql.createConnection({
host : data.database_MYSQL.host,
user : data.database_MYSQL.username,
password : data.database_MYSQL.password,
database : data.database_MYSQL.schema
}));
}
}
然后可以将其用作
Db.get().then(db => {
db.connectDatabase();
});