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

У меня есть приложение app.js node. По мере того, как этот файл начинает расти, я хотел бы переместить часть кода в некоторые другие файлы, которые я бы "требовал" или "включать" в файл 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

Чтобы сделать акцент на том, что говорили все остальные, 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;

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

cat somelibrary.js mytestfile.js | node

Ответ 6

Этот подход работает для меня в 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)
    };
})