2

私は現在、コア Node.js モジュール (dns) の 1 つが必要な動作をしないプロジェクトに取り組んでいます。代わりに機能するように思われるモジュールを見つけました: https://github.com/tjfontaine/node-dns。ただし、DNS モジュールを使用するコードは、私が書いたアプリケーション コードから数層下にあります。HTTP リクエストを作成し、そのためにいくつかのコア モジュールを使用する Request モジュール ( https://github.com/mikeal/request ) を使用しています。Request モジュールは DNS モジュールを直接使用していないようですが、これらのコア モジュールの 1 つが DNS モジュールを呼び出していると思います。

require('dns') が呼び出されるたびにノードにhttps://github.com/tjfontaine/node-dnsを使用するように指示する方法はありますか?

4

3 に答える 3

4

はい、すべきではありません。

require.cache は非常に危険なものです。何をしているのかわからず、キャッシュの不一致が悪化する可能性がある場合、メモリ リークが発生する可能性があります。コア モジュールを変更する要求のほとんどは、意図しない副作用 (DNS での発見可能性の障害など) を引き起こす可能性もあります。

https://github.com/bmeck/node-module-systemのようなものでユーザー空間の require を作成できます。ただし、これは同じ危険に直面していますが、コアに直接結び付いているわけではありません。

私の提案は、require('dns').resolve を require('async').memoize でラップすることですが、DNS の発見可能性が低下する可能性があることに注意してください。

于 2013-08-14T15:00:45.167 に答える
3

良くも悪くも、以下に示すように、何かを行う前にモジュールのホワイトリストを実装しました。dnsあなたの場合、モジュール名を明示的にチェックし、それ以外はすべて original に委譲できるはずですrequire()。ただし、この実装では、独自のコードがいつどのように実行されるかを完全に制御できることを前提としています。

var _require = constructMyOwnRequire(/*intercept 'dns' and require something else*/);

var sandbox = Object.freeze({
    /* directly import all other globals like setTimeout, setInterval, etc.. */
    require : Object.freeze(_require)
});

try {
    vm.runInContext(YOUR_SCRIPT, Object.freeze(vm.createContext(sandbox)));
} catch (exception) {
    /* stuff */
}
于 2013-08-14T15:47:32.337 に答える
0

あまり。

requirerequireは各モジュールにローカルなコア変数であるため、ノードはロードされたモジュールにそのままの変数を与えるため、スタブすることはできません。

vmモジュールを使用してそれらを実行できます。ただし、「単純な回避策」を実行するには、あまりにも多くのコードを記述する必要があります (必要なすべての変数を要求モジュールに渡し、必要な変数を適切に機能させるためにスタブするなど...)。

于 2013-08-14T14:35:50.503 に答える