web-dev-qa-db-fra.com

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

J'ai une application de noeud app.js. Alors que ce fichier commence à grossir, j'aimerais déplacer une partie du code dans d'autres fichiers que je voudrais "exiger" ou "inclure" dans le fichier app.js.

J'essaie 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');

en voiture.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 simplement à charger le contenu de car.js (au lieu de tout avoir dans le même fichier app.js). Existe-t-il un moyen particulier de procéder dans node.js?

96
Luc

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

Si vous êtes quelqu'un qui utilise des globales comme celui-ci dans un projet node.js, je les refactoriserais car il y a très peu de cas d'utilisation pour cela (il existe 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);

en voiture.js

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

module.exports.make = make;
99
Raynos

La bonne réponse est généralement d'utiliser, mais dans certains 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");
54
kybernetikos

Réponse courte:

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

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

vous pouvez 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.

8
Stephen

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

cat somelibrary.js mytestfile.js | node
4
Bouke Versteegh

Cette approche fonctionne pour moi dans Node.js, Y at-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)
    };
})
0
Marcio Pamplona