dołącz zewnętrzny plik .js do aplikacji node.js.


97

Mam aplikację węzła app.js. Ponieważ ten plik zaczyna się rozrastać, chciałbym przenieść część kodu do innych plików, których „wymagałbym” lub „zawarł” w pliku app.js.

Próbuję takich rzeczy jak:

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

w car.js:

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

Wyskoczył mi błąd:

ReferenceError: Schema is not defined

Chcę tylko załadować zawartość car.js (zamiast mieć wszystko w tym samym pliku app.js). Czy istnieje szczególny sposób na zrobienie tego w node.js?


1
Schemat nie istnieje w tym zakresie. Możesz spróbować przekazać Schema do pliku car.js za pomocą jakiejś wyeksportowanej funkcji, aby móc się do niego odwołać. To lub wymaga mangusty w car.js.
Robert

3
Node.js korzysta z CommonJS, który dzieli twój kod na różne moduły. Krótka zasada: zakres kodu w aplikacji Node to plik, w którym jest zdefiniowany. Będziesz więc musiał wymagać mongoose w car.js, a w car.js będziesz musiał wyeksportować całą resztę aplikacji. potrzeby wymagają tego w głównym pliku, tak jak robisz.
Matt Greer,

Odpowiedzi:


100

Kładzenie nacisku na to, co wszyscy inni mówili var foona najwyższym poziomie, nie tworzy globalnej zmiennej. Jeśli chcesz mieć zmienną globalną, napisz global.foo. ale wszyscy wiemy, że globaliści są źli.

Jeśli jesteś kimś, kto używa takich obiektów globalnych w projekcie node.js, w którym byłem, przerobiłbym je, ponieważ jest tak niewiele przypadków użycia (jest kilka wyjątków, ale to nie jest jeden).

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

w 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
Wskazówka dla każdego, kto czytania, można po prostu zrobić exports.foo, a następnie module.exports.foo
Tyler Egeto

9
@TylerEgeto Zawsze czuję się bezpieczniej, jeśli używam dłuższej wersji;)
Raynos

3
Czy mógłby Pan rozszerzyć przykład, aby pokazać, jak można używać zmiennych zdefiniowanych w pliku car.js w głównej aplikacji? np. `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `Jak w aplikacji można używać CarModel?
Marius,

:)) Ok, a co z ustawieniem wielu zmiennych wewnątrz funkcji? np. wiele modeli, a nawet 3 modele i 2 coś innego? Czy powinny zostać zwrócone jako część przedmiotu? np.return {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

56

Prawidłowa odpowiedź to zwykle użycie wymagania, ale w kilku przypadkach nie jest to możliwe.

Poniższy kod załatwi sprawę, ale używaj go ostrożnie:

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
Problem z tym jest następujący: „Działający kod nie ma dostępu do zakresu lokalnego”. nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

Jak to jest #include?
Steven Lu

18

Krótka odpowiedź:

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

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

To nie działa dla mnie. Otrzymuję błąd Cannot find module lib.js.
Manoj

2
@Manoj musisz poprzedzić lib.js przedrostkiem ./ tak:require('./lib.js').your_function()
Chris

8

możesz włożyć

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

u góry pliku car.js, aby działał, lub możesz zrobić to, co powiedział Raynos.


4

Jeśli chcesz tylko przetestować bibliotekę z wiersza poleceń, możesz zrobić:

cat somelibrary.js mytestfile.js | node

0

To podejście działa dla mnie w Node.js, czy jest jakiś problem z tym ?

Plik „include.js”:

fs = require('fs');

Plik „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)
    };
})

To jest źle. Plik „fs” nigdy nie jest eksportowany! Nie działa w trybie ścisłym, który jest domyślny w ES6
MyUserInStackOverflow
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.