Fügen Sie eine externe .js-Datei in die node.js-App ein

97

Ich habe eine app.js-Knotenanwendung. Da diese Datei zu wachsen beginnt, möchte ich einen Teil des Codes in einige andere Dateien verschieben, die ich in der Datei app.js "benötigen" oder "einschließen" würde.

Ich versuche Dinge wie:

// 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');

in car.js:

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

Ich habe den Fehler bekommen:

ReferenceError: Schema is not defined

Ich möchte nur den Inhalt von car.js laden (anstatt alles in derselben app.js-Datei zu haben). Gibt es eine besondere Möglichkeit, dies in node.js zu tun?

Luc
quelle
1
Schema existiert in diesem Bereich nicht. Sie können versuchen, Schema über eine exportierte Funktion an car.js zu übergeben. Auf diese Weise können Sie darauf verweisen. Das oder erfordern Mungo in car.js.
Robert
3
Node.js verwendet CommonJS, das Ihren Code in verschiedene Module unterteilt. Als Faustregel gilt, dass der Umfang des Codes in einer Node-App die Datei ist, in der sie definiert ist. Daher müssen Sie in car.js Mungo benötigen und in car.js den Rest Ihrer App exportieren muss es dann in Ihrer Hauptdatei benötigen, wie Sie es tun.
Matt Greer

Antworten:

100

Wenn Sie einen Schwerpunkt auf das legen, was alle anderen var fooauf oberster Ebene gesagt haben, wird keine globale Variable erstellt. Wenn Sie eine globale Variable möchten, schreiben Sie global.foo. aber wir alle wissen, dass Globale böse sind.

Wenn Sie jemand sind, der solche Globals in einem node.js-Projekt verwendet, an dem ich beteiligt war, würde ich sie umgestalten, da es dafür nur so wenige Anwendungsfälle gibt (es gibt einige Ausnahmen, aber dies ist keine).

// 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);

in car.js

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

module.exports.make = make;
Raynos
quelle
32
Tipp für alle, die lesen, können Sie einfach exports.foo tun, anstatt module.exports.foo
Tyler Egeto
9
@ TylerEgeto Ich fühle mich immer sicherer, wenn ich die längere Version verwende;)
Raynos
3
Würden Sie bitte das Beispiel erweitern, um zu zeigen, wie man in car.js definierte Variablen in der Haupt-App verwenden kann? zB `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `Wie benutzt man in der App CarModel?
Marius
:)) Ok, wie wäre es, wenn Sie mehrere Variablen innerhalb der Funktion einstellen? zB mehrere Modelle oder sogar 3 Modelle und 2 etwas anderes? Sollten sie als Teil eines Objekts zurückgegeben werden? zBreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius
56

Die richtige Antwort ist normalerweise erforderlich, aber in einigen Fällen ist dies nicht möglich.

Der folgende Code reicht aus, aber verwenden Sie ihn mit Vorsicht:

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");
kybernetikos
quelle
2
Das Problem dabei ist: "Ausführen von Code hat keinen Zugriff auf den lokalen Bereich." nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah
Wie ist das #include?
Steven Lu
18

Kurze Antwort:

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

// app.js
require('./lib.js').your_function();
Dorian
quelle
Das funktioniert bei mir nicht. Ich bekomme einen Fehler Cannot find module lib.js.
Manoj
2
@Manoj müssen Sie lib.js mit ./ wie folgt voranstellen:require('./lib.js').your_function()
Chris
8

du kannst Geben

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

Oben in Ihrer car.js-Datei, damit es funktioniert, oder Sie können das tun, was Raynos gesagt hat.

Stephen
quelle
4

Wenn Sie nur eine Bibliothek über die Befehlszeile testen möchten, haben Sie folgende Möglichkeiten:

cat somelibrary.js mytestfile.js | node
Bouke Versteegh
quelle
0

Dieser Ansatz funktioniert für mich in Node.js. Gibt es ein Problem mit diesem ?

Datei 'include.js':

fs = require('fs');

Datei '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)
    };
})
Marcio Pamplona
quelle
Das ist falsch. "fs" wird nie exportiert! Würde nicht im strengen Modus funktionieren, der in ES6
MyUserInStackOverflow am