2013-06-12 18 views
6

Arkadaşım ilginç bir soru sordu ve birkaç şey denedim ama boşuna, bir Node JS modülünü geçersiz kılacak bir yolu var mı? Örneğin, dosya sistemi yerine S3 kovası kullanmak için readFile işlevini geçersiz kılmak istiyorum. IE:Düğüm JS standart modül geçersiz kılma

var fs = require('fs'); 

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

Aslında prototip denedim bu

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

gibi bir şey çalışır ama onlar __proto__ nesne olmadan yerli modülleri kurdum görünüyor, onlar .constructor özelliği yok Bu kimseye bir şey ifade eder.

Nodes VM'u kullanmayı düşündüm ancak kullanıcının npm aracılığıyla modülleri takabilmesini ve kullanmasını istediğimden bu çok katı.

Aslında yeni bir modül yaratıyor geldim yakın (benim node_modules klasöründe fs.js adlı bir dosya koymak ve bunu gerektirir olamaz çünkü; bu sadece yok sayılır) ve sadece için fs değerlerini sabit ayar İstediğim ama bu tam olarak doğru değil, kullanıcının require('fs') kullanmasını ve özel işlevimi kullanmasını istiyorum.

Bu, kendi sürüm Node JS'yi derlemeden mümkün mü?

+0

node.js ile çalışmıyorum, bu hiç işe yaramayabilir. Hangi fonksiyonun 'FileSystem''ı ilan ettiğini görebilir ve sonra bunu özel nesnesiniz için bir prototip olarak kullanabilir (" subclass "). MyFS = {FileSystem.call (this);}; MyFs.prototype = yeni FileSystem(); Veya goog.base ve goog.inherit gibi bir şeyi kullanarak "ana" işlevlerini ve kurucuya iletilen parametreleri içeren bir alt sınıf oluşturun: http://docs.closure-library.googlecode.com/git/closure_goog_base. js.html Not badse ecma 5 katı çalışmıyor 'arguments.callee.caller' kullanır, bu yüzden bunu yazmak zorunda. – HMR

+0

goog.base ve goog.inherits hakkında iyi bir yazı burada: http://bolinfest.com/essays/googbase.html – HMR

+0

Açıklama yapmak için 'FileSystem'ı hazırladım, modüller' __proto__' nesnesine sahip değil ve Böylece kurucu yok. Ben en yakın ben nesne üzerinde özellikleri ayarlamak ve başka bir betik dahil ama ben '(' fs ') 'gerektirir ve benim özel işlevsellik var –

cevap

11

Sizi, yerel işlevlerin geçersiz kılınmasına karşı şiddetle uyarmak zorunda hissediyorum. Söyleniyor, bu çalışacaktır:

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

Önce ne istediğinizi geçersiz kılmak için kendi ile kullanıcının komut sarmak gerekir.

+0

+1 Uyarı için. Temel modüller ile uğraşmayın. – aggsol

+0

Biliyorum, kişisel olarak olmazdım. En azından vm değil ama ilginç bir soru. Ancak bu, zaten denediğim ile aynı ve istediği gibi değil. –

+0

@Lavient işlevlerini geçersiz kılmaktan kaçınmak için belirli bir neden var mı? Veritabanı okumalarını ve yazmalarını geçersiz kılmak için benzer bir şey yapmayı planlıyorum. – DanMatlin