включить внешний файл .js в приложение node.js

98

У меня есть приложение узла app.js. Поскольку этот файл начинает расти, я хотел бы переместить часть кода в другие файлы, которые я бы «потребовал» или «включил» в файл app.js.

Я пробую такие вещи, как:

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

в car.js:

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

Получил ошибку:

ReferenceError: Schema is not defined

Я просто хочу, чтобы содержимое car.js было загружено (вместо того, чтобы иметь все в одном файле app.js). Есть ли особый способ сделать это в node.js?

Люк
источник
1
Схема не существует в этой области. Вы можете попробовать передать схему в car.js через какую-нибудь экспортируемую функцию, чтобы вы могли ссылаться на нее. Это или требуется мангуст в car.js.
Роберт
3
Node.js использует CommonJS, который разделяет ваш код на разные модули. Простое практическое правило: объем кода в приложении Node - это файл, в котором он определен. Таким образом, вам потребуется mongoose в car.js, а в car.js вам нужно будет экспортировать все остальное приложение. затем потребуйте его в своем основном файле, как и вы.
Мэтт Грир

Ответы:

100

Чтобы сделать акцент на том, что все говорят var fooна верхнем уровне, не нужно создавать глобальную переменную. Если вам нужна глобальная переменная, напишите global.foo. но все мы знаем, что глобалы - зло.

Если вы тот, кто использует подобные глобальные переменные в проекте node.js, в котором я участвовал, я бы реорганизовал их, поскольку для этого очень мало вариантов использования (есть несколько исключений, но это не один).

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

в 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
Совет для всех, кто читает: вы можете просто сделать exports.foo, а не module.exports.foo
Тайлер Эгето,
9
@TylerEgeto Я всегда чувствую себя в большей безопасности, если использую более длинную версию;)
Raynos
3
Не могли бы вы расширить пример, чтобы показать, как можно использовать переменные, определенные внутри car.js в основном приложении? например, `function make (...) {... CarModel = mongoose.model ('Автомобиль', CarSchema); } `Как использовать CarModel внутри приложения?
Мариус
:)) Хорошо, а как насчет установки нескольких варов внутри функции? например, несколько моделей или даже 3 модели и еще 2? Следует ли их возвращать как часть объекта? напримерreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Мариус
57

Обычно правильный ответ - использовать require, но в некоторых случаях это невозможно.

Следующий код поможет, но используйте его осторожно:

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
Проблема с этим: «У запущенного кода нет доступа к локальной области». nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Петах
На что это похоже #include?
Стивен Лу
18

Короткий ответ:

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

// app.js
require('./lib.js').your_function();
Дориан
источник
У меня это не работает. Я получаю сообщение об ошибке Cannot find module lib.js.
Manoj
2
@Manoj, вы должны добавить к lib.js префикс ./ вот так:require('./lib.js').your_function()
Крис
8

вы можете положить

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

в верхней части файла car.js, чтобы он работал, или вы можете сделать то, что сказал Рейнос.

Стивен
источник
4

Если вы просто хотите протестировать библиотеку из командной строки, вы можете сделать:

cat somelibrary.js mytestfile.js | node
Буке Верстех
источник
0

Этот подход работает для меня в Node.js. Есть ли проблемы с этим ?

Файл include.js:

fs = require('fs');

Файл 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)
    };
})
Марсио Памплона
источник
Это не верно. "fs" никогда не экспортируется! Не будет работать в строгом режиме, который используется по умолчанию в ES6
MyUserInStackOverflow