0

私は次のクラスを持っています。

class User 
{
    constructor( username )
    {
        this._username = username;  
    }

    get username()
    {
        return this._username;
    }
}

User オブジェクトをインスタンス化してネットワーク経由で送信するとmyUserObject.username、受信側でアクセスしようとすると未定義であるとmyUserObject._username表示されますが、送信側で設定した値が含まれています。zeromq と messagepack で構築された zerorpc を使用しています。これを機能させるために追加または別の方法でできることはありますか? この問題は、通常のクラス関数でも発生します。今のところ、私のその場しのぎの解決策は、欠陥のあるオブジェクトをコンストラクターに渡し、フィールドを再割り当てすることにより、レシーバー側でオブジェクトを再作成することです。

送信者:

import User from './User.js'
const client = new zerorpc.Client();

//code for client to connect

function createUser()
{
    let user = new User( "kacy" );
    console.log( user.username ); //kacy
    client.invoke( 'createUser', user, someCallback );
}

レシーバー:

import User from './User.js'

createUser( user )
{
    console.log( user._username ); //kacy
    console.log( user.username ); //undefined
    let user2 = new User( user._username );
    console.log( user2.username ); //kacy
}
4

1 に答える 1

1

zerorpc はコードを送信しません。username()は関数であり、ネットワーク経由で送信されませんが_username、 は属性です。zerorpc は、任意の json のようなデータ型を送信できます。それ以上でもそれ以下でもありません。

この制限の背後に考えられる理由はいくつかあります。

  • コードの送信は、セキュリティ リスクへの簡単な経路です (文字通りのリモート コード インジェクション)。
  • コードには不活性なデータに対して扱いにくい動作があり、非常に微妙な方法でクライアント/サーバー間の契約を簡単に破ることができます
  • 言語間でコードを送信するのは明らかに簡単ではありません (zerorpc は多言語化を目指しているため)。これには、一般的なインタープリター言語 (たとえばluaなど) が必要です。
  • 結果を恐れない場合は、コードをリテラル テキストとして自由に送信eval()し、反対側に送信してください。
于 2016-07-25T18:19:35.443 に答える