inclure un fichier .js externe dans l'application node.js


98

J'ai une application de nœud app.js. Au fur et à mesure que ce fichier commence à se développer, j'aimerais déplacer une partie du code dans d'autres fichiers que je "demanderais" ou "inclurais" dans le fichier app.js.

J'essaye des choses comme:

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

// THE FOLLOWING REQUIRE DOES NOT WORK
require('./models/car.js');

dans car.js:

// Define Car model
CarSchema = new Schema({
  brand        : String,
  type : String
});
mongoose.model('Car', CarSchema);

J'ai eu l'erreur:

ReferenceError: Schema is not defined

Je cherche juste à avoir le contenu de car.js chargé (au lieu d'avoir tout dans le même fichier app.js) Y a-t-il un moyen particulier de faire cela dans node.js?


1
Le schéma n'existe pas dans cette portée. Vous pouvez essayer de passer Schema dans car.js via une sorte de fonction exportée, de cette façon vous pourrez le référencer. Cela ou exiger la mangouste dans car.js.
Robert

3
Node.js utilise CommonJS, qui divise votre code en différents modules. En règle générale, la portée du code dans une application Node est le fichier dans lequel elle est définie. Vous aurez donc besoin de mangouste dans car.js, et dans car.js, vous devrez exporter tout le reste de votre application les besoins alors l'exigent dans votre fichier principal comme vous le faites.
Matt Greer

Réponses:


100

Mettre l'accent sur ce que tout le monde a dit var fooau plus haut niveau ne crée pas de variable globale. Si vous voulez une variable globale, écrivez global.foo. mais nous savons tous que les globaux sont mauvais.

Si vous êtes quelqu'un qui utilise des globaux comme celui-ci dans un projet node.js sur lequel j'étais, je les refactoriserais car il y a si peu de cas d'utilisation pour cela (il y a quelques exceptions mais ce n'en est pas un).

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

require('./models/car.js').make(Schema, mongoose);

dans car.js

function make(Schema, mongoose) {
    // Define Car model
    CarSchema = new Schema({
      brand        : String,
      type : String
    });
    mongoose.model('Car', CarSchema);
}

module.exports.make = make;

32
Astuce pour tous ceux qui lisent, vous pouvez simplement faire exports.foo, plutôt que module.exports.foo
Tyler Egeto

9
@TylerEgeto Je me sens toujours plus en sécurité si j'utilise la version plus longue;)
Raynos

3
Voudriez-vous développer l'exemple pour montrer comment utiliser les variables définies dans car.js dans l'application principale? par exemple `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `Dans l'application, comment utilise-t-on CarModel?
Marius

:)) Ok, qu'en est-il lors de la configuration de plusieurs variables dans la fonction? par exemple plusieurs modèles, ou même 3 modèles, et 2 autres quelque chose? Doivent-ils être retournés dans le cadre d'un objet? par exemplereturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

57

La bonne réponse est généralement d'utiliser require, mais dans quelques cas, ce n'est pas possible.

Le code suivant fera l'affaire, mais utilisez-le avec précaution:

var fs = require('fs');
var vm = require('vm');
var includeInThisContext = function(path) {
    var code = fs.readFileSync(path);
    vm.runInThisContext(code, path);
}.bind(this);
includeInThisContext(__dirname+"/models/car.js");

2
Le problème avec ceci est: "Le code en cours d'exécution n'a pas accès à la portée locale." nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

Qu'est-ce que c'est que ça #include?
Steven Lu

18

Réponse courte:

// lib.js
module.exports.your_function = function () {
  // Something...
};

// app.js
require('./lib.js').your_function();

Cela ne fonctionne pas pour moi. Je reçois une erreur Cannot find module lib.js.
Manoj

2
@Manoj vous devez préfixer lib.js avec ./ comme ceci:require('./lib.js').your_function()
Chris

8

tu peux mettre

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

en haut de votre fichier car.js pour que cela fonctionne, ou vous pouvez faire ce que Raynos a dit de faire.


4

Si vous souhaitez simplement tester une bibliothèque à partir de la ligne de commande, vous pouvez faire:

cat somelibrary.js mytestfile.js | node

0

Cette approche fonctionne pour moi dans Node.js, y a-t-il un problème avec celui-ci ?

Fichier 'include.js':

fs = require('fs');

Fichier 'main.js':

require('./include.js');

fs.readFile('./file.json', function (err, data) {
    if (err) {
        console.log('ERROR: file.json not found...')
    } else {
        contents = JSON.parse(data)
    };
})

C'est faux. "fs" n'est jamais exporté! Ne fonctionnerait pas en mode strict qui est par défaut dans ES6
MyUserInStackOverflow
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.