2

Javascript+NodeJSで書かれたIRCボットを作成しようとしていました。このボットは、実行中にプラグインをロードでき、変更などの後に同じプラグインをリロードできる必要があります。

何が機能しますか?

実行時にファイルをロードし、そのコードを実行します。

どうしたの?

同じプラグインを再度ロードした後、コードを実行している場合でも、プラグインをロードすると2回またはn回発生します。

現在のコード:

bot.match(/\.load/i, function(msg) {
    require('./plugins/plug.js')(this);
});

module.exports  = function(bot) {
    bot.match(/\.ping/i, function(msg) {
    msg.reply('pong');
});

それで、私の問題を修正してこれを機能させる方法はありますか?

PS私はこのボットのベースとしてIRC-JSを使用しています。

更新、修正:

そのファイルへの変更も無視されるため、キャッシュのようなものである必要があります。

をクリアすることで修正require.cache

4

2 に答える 2

4

requireファイルをリロードしません。一度ロードされると、メモリ内にあり、再度リロードされることはありません。ボットをオンのままにしてrequire、「オンザフライ」でスクリプトの内容を変更したいようです。を削除することでそれを行うことができますrequire.cachenode.js require()キャッシュをチェックしてください-無効にすることは可能ですか?およびhttp://nodejs.org/api/modules.html#modules_caching

于 2012-11-20T20:10:33.527 に答える
3

私自身の質問に答えるために。プラグインをロードしている間、私はすべてのオブジェクトをグローバル配列に追加します。これは、後で簡単にアクセスして削除できます。

function clearplugins() {
    require("fs").readdirSync("./plugins/active").forEach(function(file) {
        delete require.cache[require.resolve("./plugins/active/" + file)];
    });

    plugins.forEach(function(obj) {
        obj();
    });
}

function loadplugins() {
    require("fs").readdirSync("./plugins/active").forEach(function(file) {

        if(file.slice(-2) == 'js') {
            plugins.push(require("./plugins/active/" + file)(bot));
            console.log(file+' loaded');
        }
    });
}
于 2012-12-02T13:49:08.640 に答える