2013-06-12 11 views
6

フレンドが興味深い質問をしましたが、いくつか試しましたが役に立たないのですが、ノードJSモジュールをオーバーライドする方法はありますか?ノードJSオーバーライド標準モジュール

たとえば、ファイルシステムではなくS3バケットを使用するreadFile関数をオーバーライドしたいとします。 IE:

var fs = require('fs'); 

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

は、実際に私はプロトタイプを試みたが、それは彼らが__proto__オブジェクトなしでネイティブモジュールを設定しているようで、彼らは.constructor性質を持っていないこの

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

のようなものを実行しますそれは誰にでも何でも意味します。

私はNodes VMを使用することを考えましたが、ユーザーがnpm経由でモジュールをインストールして使用できるようにするには、これは厳しいものです。

私は実際に新しいモジュールを作成する(私は私のnode_modulesフォルダにfs.jsという名前のファイルを入れて、それを必要とすることはできませんので、。それだけでも無視されます)されて来ている最も近いとちょうどfsの値をハード設定私が望むものだが、これは正しくない、私はユーザにrequire('fs')を使用して、私のカスタム関数を使用したい。

独自のバージョンのNode 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 strictでは動作しませんので、書き直す必要があります。 – 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

関連する問題