Bonjour à tous.
Je suis entrain d'implémenter une classe dbConnection, possédant une méthode query.
Cette méthode query effectue une requête dans la base de données à l'aide de la fonction query de mysql.Connection, et je souhaite que la méthode query de ma classe ait pour valeur de retour le résultat de la requête.

Voici ma classe :
Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
 
import mysql from 'mysql';
 
export default class dbConnection {
    readonly host:string;
    readonly user:string;
    readonly password:string;
    readonly db:string;
    connection:mysql.Connection;
 
    constructor(host:string,user:string,password:string,db:string) {
        this.host=host;
        this.db=db;
        this.user=user;
        this.password=password;
        this.connection = mysql.createConnection({
            host: this.host,
            user: this.user,
            password:this.password,
            database: this.db
        });
    }
 
    connect():void {
        this.connection.connect(function(err:Error){
            if (err) {
              return console.error('Erreur: ' + err.message);
            }
 
            console.log('Connecté au serveur MySQL.');
        });
    }
 
    query(query:string):string {
        var response:string="No response";
        this.connection.query(query, function (err:string, result:string) {
            if (err) result=err;
            response=result;
        });
        return response;
    }
}

La méthode query de cette classe est appelée comme suit dans un autre fichier :
Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
const link = new dbConnection('localhost','','','ma_db');
link.connect();
 
function queryDb(query:string):string{
    return link.query(query);
}

Je cherche donc à récupérer le retour de la méthode query, à savoir le résultat de la requête vers la base de données. Malheureusement, la variable response de cette méthode n'est pas modifiée comme je le demande.
J'ai vu que cela venait d'un phénomène de synchronnie/asynchronie et j'ai donc implémenté une solution proposée, utilisant un callback, qui est :

Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
query(query:string,callback:(str:string) => void):void {
    this.connection.query(query, function (err:string, result:string):void {
        if (err) throw err;
          callback(result);
     });
}
Appelée de cette manière :
Code typescript : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
function queryDb(query:string):string{
    let response = "No response";
    link.query(query, function(res:string):void {
        response = res;
        console.log("Res :" + response); // La réponse est bien récupérée
    });
    console.log("Other res :" + response); // Mais n'est plus visible ici
    return response;
}
Cependant cela ne fonctionne pas non plus. Précisément cela fonctionne mais la zone de visibilité de la variable response n'est pas assez grande : j'en ai besoin dans les reste du code, puisque c'est même la valeur de reour de queryDb();

Est-ce que quelqu'un voit comment étendre cette zone de visibilité, ou aurait une autre solution alternative à l'utilisation d'un callback pour solutionner mon problème ?
Merci d'avance pour votre aide.