2017-04-24 2 views
0

Ich benutze ES6, um von Node.js App-Klasse zu erstellen. Ich möchte eine db-Klasse erstellen, also tat ich folgendes:Node.js ES6-Klasse privater Speicher

"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; 

Es ist das erste Ich versuche, eine private Variable zu speichern, und ich sah, die im Internet nach Lösungen. Ich habe die Weakmap-Lösung gefunden, die ich implementiert habe. Aber die MySQL-Verbindung speichert es nicht mit dem folgenden Quellcode. Ich habe diese Ausgabe:

_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) 

So, wie man damit umgehen?

EDIT:

Hier ist, wie Anrufer wissen, wann es initialisiert ist:

var db; 

function instantiateDb(callback){ 
     db = new db_connector(); 
     callback(db); 
} 

instantiateDb(function(db){ 
    db.connectDatabase(); 
}) 
+0

'verwendet this' ist innerhalb des Callbacks nicht definiert. Weitere Informationen finden Sie unter [So greifen Sie auf das richtige 'This' innerhalb eines Callbacks zu?] (Https://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-inside-a-callback) für eine Lösung . Der Gesamtansatz erscheint jedoch fragwürdig. Angenommen, dass "Parse" asynchron ist, wie weiß der Anrufer dann, wenn die Initialisierung abgeschlossen ist? –

+0

Der Anrufer weiß es Ich habe versucht, Versprechen ohne Erfolg umzusetzen, also verwende ich Callback-Funktion, wie in der Bearbeitung –

+0

Und im Moment der Callback aufgerufen wird, ist "ini.parse" * noch * nicht getan. Sie übergeben grundsätzlich ein unvollständiges Objekt an den Rückruf. –

Antwort

0

this ist undefined innerhalb der Callback, es ist nicht auf eine Instanz Db Bezug genommen wird, also erhalten Sie diesen Fehler . Werfen Sie einen Blick auf How to access the correct `this` inside a callback? für, wie man das löst.

Allerdings gibt es ein viel größeres Problem hier: Sie führen eine asynchrone Operation innerhalb des Konstruktors durch. Das bedeutet, dass eine Instanz von Db nicht wissen kann, wann sie vollständig initialisiert wird.

Ein besserer Weg, dies zu lösen, ist eine statische asynchrone Methode zu haben, die eine neue, vollständig initialisierte Instanz Db zurück:

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 
    })); 
    } 
} 

die als

werden kann dann
Db.get().then(db => { 
    db.connectDatabase(); 
});