2013-06-12 6 views
6

을 무시합니다. 친구가 흥미로운 질문을 던지고 몇 가지 시도했지만 아무 소용이 없어도 노드 JS 모듈을 무시할 수있는 방법이 있습니까?노드 JS는 표준 모듈

예를 들어 파일 시스템 대신 S3 버킷을 사용하도록 readFile 함수를 재정의하려고합니다. IE는 :

var fs = require('fs'); 

fs.readFile('my_text_file.txt', ...); 

이 사실 나는 프로토 타입을 해봤이

FileSystem.readFile = function() { 
    // Connect to S3 and retrieve remote file 
} 

같은 것을 실행하지만 그들이 __proto__ 목적없이 네이티브 모듈을 설정 한 것 같다, 그들은 .constructor 속성이 없습니다 그건 누구에게나 의미가 있습니다.

나는 Nodes VM을 사용하는 것에 대해 생각해 보았습니다.하지만 사용자가 npm을 통해 모듈을 설치하고 사용하기를 원하기 때문에 너무 엄격합니다.

실제로 새 모듈 생성되어 왔어요 가장 가까운 곳 (내 node_modules 폴더에 fs.js라는 이름의 파일을 넣어 그것을 필요로 할 수 없기 때문에, 그냥 무시됩니다) 단지에 fs의 값을 하드 설정을 내가 원하는 것은 아니지만 이것은 옳지 않다. 나는 사용자가 require('fs')을 사용하고 내 사용자 정의 함수를 사용하기를 원한다.

내 노드 JS를 직접 컴파일하지 않고도이 작업을 수행 할 수 있습니까?

+0

node.js로 작업하지 않았으므로 전혀 작동하지 않을 수 있습니다. 어떤 함수가'FileSystem'을 선언하고 사용자 정의 객체 ("하위 클래스")의 프로토 타입으로 사용하는지 확인할 수 있습니다. MyFS = {FileSystem.call (this);}; MyFs.prototype = new FileSystem(); 또는 goog.base 및 goog.inherit과 같은 것을 사용하여 부모 함수를 호출하고 생성자에 전달 된 매개 변수 (http://docs.closure-library.googlecode.com/git/closure_goog_base)를 처리 할 수있는 하위 클래스를 만듭니다. js.html badse는'arguments.callee.caller'를 사용합니다. 왜냐하면 ecma 5에서는 작동하지 않기 때문에 당신은 다시 작성해야합니다. – HMR

+0

goog.base와 goog.inherits에 대한 좋은 글은 여기에 있습니다 : http://bolinfest.com/essays/googbase.html – HMR

+0

설명을 위해'FileSystem'을 만들었고, 모듈에는'__proto__' 객체가없고 따라서 생성자가 없습니다. 가장 가까운 것은 객체에 직접 속성을 설정하고 다른 스크립트를 포함하는 것입니다. 그러나'require ('fs')하고 싶습니다. 그리고 내 사용자 정의 기능이 있습니다. –

답변

11

네이티브 함수를 재정의하는 것에 대해 강하게 경고해야한다고 느낍니다. 말했다되고 있음이 작동합니다 :

main.js:

var fs = require('fs'), 
    oldReadFile = fs.readFile; 

fs.readFile = function (filename, options, callback) { 
    console.log('hey!'); 
    oldReadFile(filename, options, callback) 
}; 

var other = require('./other'); 
other.test(); 

other.js:

var fs = require('fs'); 

exports.test = function() { 
    fs.readFile('./main.js', {encoding: 'utf8'}, function (err, data) { 
    console.log(err, data); 
    }); 
}; 

먼저 당신이 원하는 것을 대체 할 자신과 사용자의 스크립트를 포장해야합니다.

+0

+1 경고 메시지입니다. 기본 모듈을 망가지지 마십시오. – aggsol

+0

알아, 나는 개인적으로하지 않을거야. 최소한'VM '이 없어도 흥미로운 질문입니다. 이것은 그러나 내가 이미 시도한 것과 동일하고 그가 원하는 것을 꽤하지 않습니다. –

+0

@Laurent 네이티브 함수를 재정의하는 것을 피하는 특별한 이유는 무엇입니까? 나는 데이터베이스 읽기와 쓰기를 덮어 쓰는 것과 비슷한 것을 할 계획이다. – DanMatlin