1

私はもともと、すべてのコードを 1 つのファイルにまとめ、コンストラクターと IIFE を使用して個別のチャンクに分割した nodejs で動作するアプリケーションを持っていました。賢明な分離と分離を提供するために、各チャンクが別のファイルに存在するようにプログラムをリファクタリングしようとしましたが、問題が発生しました。

プログラムは 3 つのコア チャンクに分割されます。

Redis に接続するために初期化し、redis クライアントと dataStore オブジェクトを返すデータストア コンストラクター。

function CreateDataStore(storePort, storeUrl, passwd) {
    var client
    ,   datastore;

    //create the redis client
    //create the datastore

    //exports
    return {
        "redisClient": client,
        "dataObject": createSiteUpdater("")
    };
}

var dataStore = CreateDataStore("xxxx","xxxx","xxxx");
var client = dataStore.redisClient;
var testResults = dataStore.dataObject;

redis クライアントを使用し、データストア オブジェクトにデータを格納する Web クローラー コンストラクター。

function CreateWebCrawler(){
    //do some stuff
    //initialise robots.txt parser

    return function() {
    //crawl a page
    //add page data to testResults object
    }
}

同じデータストア オブジェクトを読み取り、データをフロントエンド クライアントに送信する Web サーバー コンストラクター。

function CreateWebServer() {
    //do some stuff
    //initialise an express webserver
    //initialise socket.io
    //send testResults object out over a socket.
}

これは、同じファイルにあるときはすべて正常に機能しましたが、3 つの個別のファイルにリファクタリングしたいので、それらが互いにどのように通信するのかについて混乱しています。

新しいアーキテクチャーの下では、Web クローラー・モジュールと Web サーバー・モジュールの両方が、dataStore オブジェクトをエクスポートするデータ・ストア・モジュールを「必要」とします。私が行う必要があるのは、Web クローラー モジュールによってその dataStore オブジェクトに加えられたすべての変更が、Web サーバー モジュールで使用可能な dataStore オブジェクトのバージョンに複製されることです。

私はすべてのnodejsドキュメントを調べてみましたが、多くのグーグルも行いましたが、commonjsモジュールのexportステートメントによって返されるオブジェクトが同じオブジェクトである場合、私の人生では解決できません依存関係グラフの上位にある 2 つの異なるモジュールに個別に返された場合のヒープ。これが本当かどうかを誰かに説明してもらえますか?理想的には、動作を適切に理解するための正しいドキュメントへのリンクを提供してもらえますか?

4

1 に答える 1

1

ここに私がそれを行う方法があります:

var datastore = {};
module.exports = datastore;
var redis = require('redis');

var client = '';
var testResults = '';

datastore.CreateDataStore = function(storePort, storeUrl, passwd) {
    client = redis.createClient(storePort,storeUrl);
    redisClient.auth(passwd, function() {
        console.log("redisAuth Connected!");
    });
    testResults = createSiteUpdater("");
}

datastore.setdata = function(data, callback){
    client.set(data.key, data.value, callback);
}

2 番目の関数は、データベースへのアクセサ関数です。これが最善の方法かどうかはわかりませんが、データストア オブジェクトへの変更を保存する必要がある場合は、さまざまなデータベースを簡単に交換できます。複数のモジュールを必要とする代わりに、単一のオブジェクトを渡します

以下は、私が作成したアカウント マネージャー モジュールの複数のデータベースを使用した、より完全な例です。

https://github.com/hortinstein/accountManager/tree/master/databaseMiddleware

于 2013-06-05T12:15:19.703 に答える