0
votes

Comment puis-je créer une variable statique dans `module.exports = class` dans node.js

Comment puis-je initialiser une variable statique dans module.exports = class dans node.js.

Fondamentalement, ce que j'essaie de réaliser, c'est que si StaticVariable est nul, j'obtiendrai des données à partir d'un fichier json. Puis stockez-le dans StaticVariable .

module.exports = class Config { 
    static fetch() {

        if ( StaticVariable === null ) {
            const fs = require('fs');
            const data = fs.readFileSync('./config.json');
            const config = JSON.parse(data);  

            StaticVariable = config;

        }

        return StaticVariable;
    }
}

La fonction fetch() sera appelée plusieurs fois, il n'est donc pas nécessaire de readFileSync chaque appel.


7 commentaires

Quel problème avez-vous avec ce code, à part le fait que vous n'avez pas défini la variable StaticVariable? La classe statique uniquement est un anti-modèle. Fetch est-il le seul membre?


J'ai rendu fetch() statique parce que je ne veux pas de new Config . @estus


Cela n'explique pas pourquoi vous avez besoin d'un cours. Fetch est-il le seul membre?


Si vous demandez si fetch est la seule fonction, ce n'est pas le cas. Il y aura de new , mises à update etc. et ne seront pas une fonction statique. @estus


Veuillez mettre à jour la question avec tout le code pertinent et un exemple d'utilisation de Config. Est-il censé y avoir plusieurs instances? Ce que vous avez ici semble être un problème XY qui pourrait être résolu d'une meilleure manière. Est-il nécessaire d'avoir une fetch paresseuse? Vous pouvez simplement faire exports.config = require('./config.json') en haut du module


StaticVariable est- StaticVariable défini et comment utiliser la fonction de fetch ?


@estus Ouais. Je suis d'accord que c'est un problème XY, je pense que je vais juste vérifier d'autres façons de procéder. Merci. :)


3 Réponses :


0
votes

La classe statique uniquement est un anti-modèle en JavaScript car une classe n'est jamais instanciée.

Dans le cas où il est nécessaire d'avoir une méthode qui charge paresseusement le fichier JSON, un objet simple peut être utilisé. Il existe déjà un tel objet dans la portée du module, module.exports :

exports.Config = class Config {
  constructor() {
    this.config = deepClone(exports.config);
  }

  modify() {
    // modify this.config
  }
};

Il peut ne pas être nécessaire de l'analyser manuellement car cela pourrait être géré par require('./config.json') one-liner et avec des chemins relatifs plus cohérents.

Dans le cas où le fichier JSON peut être chargé avec impatience , cela peut être simplifié à:

exports.config = require('./config.json');

S'il y a un besoin pour la classe Config et qu'elle doit accéder à l'objet de configuration, elle peut s'y référer, par exemple:

const fs = require('fs');
let StaticVariable;

exports.fetch = () => {
    if ( StaticVariable == undefined ) { // not "=== null"
        const data = fs.readFileSync('./config.json');
        const config = JSON.parse(data);  

        StaticVariable = config;

    }

    return StaticVariable;
}


0 commentaires

0
votes

Je peux penser à plusieurs façons de réaliser ce que vous demandez.

L'enregistrer dans une variable globale

module.exports = class Config { 
    static fetch() {
          return require('./config.json');
    }
}

Ou utilisez simplement require. Require fera la même chose que ce que vous voulez faire. Il lira le fichier config.json, essaiera de l'analyser comme un json valide et il ne le fera qu'une seule fois.

//initialise it here
var StaticVariable = null;

//however if you initialise it here, it makes more sense to just load it once
const fs = require('fs');
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);  
StaticVariable = config;

module.exports = class Config { 
    static fetch() {
        return StaticVariable;
    }
}


0 commentaires

0
votes

À partir de (nœud 15.2.1) ES2020, les champs de classe privée statique sont pris en charge. Ainsi, à partir de maintenant, la classe statique peut ne pas être anti-pattern et vous pouvez instancier une classe en utilisant de nouveaux mots clés. réf: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

exports.config = require('./config.json');

Où le signe # signifie privé, plus de références peuvent être trouvées dans https://node.green , mais le moyen le plus simple est toujours décrit dans d'autres réponses

module.exports = class Config { 
    static #StaticVariable = null;
    static fetch() {    
        if ( StaticVariable === null ) {
            const fs = require('fs');
            const data = fs.readFileSync('./config.json');
            const config = JSON.parse(data);  

            StaticVariable = config;

        }    
        return StaticVariable;
    }
}


0 commentaires