node.js 앱에 외부 .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

동일한 app.js 파일에 모든 것을 포함하는 대신 car.js의 내용을로드하려고합니다. node.js에서이 작업을 수행하는 특별한 방법이 있습니까?


1
해당 범위에는 스키마가 없습니다. 일종의 내 보낸 함수를 통해 스키마를 car.js에 전달해 볼 수 있습니다. 그런 식으로 참조 할 수 있습니다. car.js 내에서 몽구스가 필요합니다.
Robert

3
Node.js는 코드를 여러 모듈로 나누는 CommonJS를 사용합니다. 간단한 경험 법칙, Node 앱의 코드 범위는 정의 된 파일입니다. 따라서 car.js에서 mongoose가 필요하고 car.js에서는 나머지 앱을 내 보내야합니다. 그런 다음 필요한 것처럼 주 파일에서 필요합니다.
Matt Greer 2011

답변:


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
사람이 읽기에 대한 팁, 당신은 단지보다는 module.exports.foo, exports.foo을 수행 할 수 있습니다
타일러 Egeto에게

9
@TylerEgeto 더 긴 버전을 사용하면 항상 더 안전하다고 느낍니다;)
Raynos

3
메인 앱에서 car.js 내부에 정의 된 변수를 어떻게 사용할 수 있는지 보여주기 위해 예제를 확장 해주시겠습니까? 예`function make (...) {... CarModel = mongoose.model ( 'Car', CarSchema); }`앱 안에서 CarModel은 어떻게 사용하나요?
Marius

:)) 좋아, 함수 내부에 여러 변수를 설정할 때 어떻습니까? 예를 들어 여러 모델 또는 3 개의 모델과 2 개의 다른 모델? 개체의 일부로 반환되어야합니까? 예return {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

56

정답은 일반적으로 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
Petah

이건 #include어때?
Steven Lu

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 파일의 맨 위에 있거나 Raynos가 말한대로 수행 할 수 있습니다.


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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.