включити зовнішній файл .js у додаток node.js


97

У мене є додаток для вузла 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 - це файл, у якому він визначений. Отже, вам потрібно буде вимагати мангуста в 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
Порада для кожного, хто читає, ви можете просто виконати export.foo, а не module.exports.foo
Tyler Egeto

9
@TylerEgeto Я завжди відчуваю себе безпечніше, якщо використовую довшу версію;)
Raynos,

3
Будь ласка, розгорніть приклад, щоб показати, як можна використовувати змінні, визначені у car.js, у головному додатку? наприклад, `make make (...) {... CarModel = mongoose.model ('Автомобіль', CarSchema); } `Як у програмі використовується CarModel?
Маріус

:)) Гаразд, як щодо встановлення декількох vars всередині функції? наприклад, кілька моделей, або навіть 3 моделі, і 2 щось інше? Чи повинні вони бути повернуті як частина об'єкта? наприкладreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Маріус

56

Правильну відповідь, як правило, використовувати вимагають, але в деяких випадках це неможливо.

Наступний код виконає трюк, але використовуйте його обережно:

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
Petah

Що це таке #include?
Стівен Лу

18

Коротка відповідь:

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

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

Це не працює для мене. Я отримую помилку Cannot find module lib.js.
Маной

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.