web-dev-qa-db-fra.com

Module NodeJS requis non disponible dans les autres modules

Je suis un peu nouveau pour NodeJS. C'est peut-être juste la façon dont cela fonctionne, mais pour être sûr:

Mon 'index.js':

var fs = require('fs');
// do something with fs here
var app = require('./app.js');

Le 'app.js'

fs.readFile('/somedir/somefile.txt', 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  console.log(data);
});

Ensuite, je reçois une erreur:

ReferenceError: fs is not defined

Comme je l'ai lu, la "solution" à cela est de "requérir" le module fs dans app.js. Maintenant, ce que je comprends, c'est que le module fs est mis en cache (n'importe quel module, mais en utilisant l'exemple) donc Node sera toujours très rapide. Ce que je n'ai pas vraiment, c'est: "Si le module fs est mis en cache, donc en fait il est un peu disponible de toute façon, pourquoi dois-je encore "ré-exiger" le module?

Je serai honnête; c'est juste pour comprendre pourquoi.

20
Bas van Ommen

Chaque fichier doit inclure des références aux modules

index.js

var fs    = require("fs"),
    other = require("./otherfile"); 

// you can now use `fs`

otherfile.js

var fs = require("fs");

// you can now use `fs` here

L'une des meilleures parties à ce sujet est que vous n'êtes pas obligé de nommer la variable d'une certaine manière dans un fichier donné. Chaque fichier est à peu près isolé de tous les autres fichiers de votre bibliothèque, et c'est une bonne chose très.

Sachez également que vous pouvez inclure uniquement des pièces d'un module si vous le souhaitez

var read = require("fs").readFile;

read("myfile.txt", function(err, data) {
  if (error) {
    return throw error;
  }
  console.log(data);
};

Explication:

Node.js n'encourage pas l'utilisation de globaux; et en tant que tel, vous ne devriez pas essayer d'implémenter des choses qui dépendent de variables globales.

Lorsque vous appelez à nouveau le module fs, il ne le "ré-exige" pas tant que vous déclarez simplement une variable qui pointe vers le module mis en cache.


Exemple supplémentaire:

Dans cette réponse je vais en détail sur la façon de structurer une application simple qui évite l'utilisation de globaux.

35
user633183

Parfois, nous pouvons l'oublier, mais il est fondamental de le déclarer:

var fs = require('fs');
4
Felipe