2017-12-13 27 views
0

私は単純なnode.js websocketサーバーを構築しています。クライアントからサーバーに要求を送信して、処理するだけです(害を及ぼすことはありません) 。理想的には、クライアントは2つの変数を持つオブジェクトをサーバーに渡します。その1つはオブジェクト用で、もう1つは呼び出すオブジェクト内の特定の関数用です。このような何か:変数を使ってオブジェクト関数を呼び出す

var callObject = { 
 
    'obj': 'testObject', 
 
    'func':'testFunc' 
 
} 
 

 
var testObject = { 
 
    func: function(){ 
 
    alert('it worked'); 
 
    } 
 
} 
 

 
// I would expect to be able to call it with sometihng like. 
 
console.log(window[callObject.obj]); 
 
console.log(window[callObject.obj][callObject.func]);

それはいつも私に語った、(Node.jsのではなく、ブラウザウィンドウのそれを使用していないので)私はグローバルでそれを呼び出してみましたが、それは動作しません。 undefinedのcallObject.funcを見つけることができません。 callObject.objのconsole.logを呼び出すと、オブジェクト変数が文字列として期待通りに表示されます。オブジェクト自体にconsole.logを実行すると、オブジェクトが返されます。

私はこれがかなりシンプルだと思っていますが、私のGoogle-fuは失敗しています。

+0

これはうまくいく方法はありません。 'window'のような' global'もありません。 'callObject.obj'のswitch文のように、もっとコードを書くか、別のオブジェクトの中で呼び出す全てのオブジェクトを保持する必要があります。 – Ross

答えて

0

私のお勧めは、そのパターンに抵抗し、クライアントコードで呼び出す関数を選択しないことです。あなたが慎重でない場合は、素晴らしい大きなセキュリティホールを自分で構築しています。特にevalの使用を検討している場合。

代わりに、クライアントから送信されたデータとサーバーコードの間に、より明示的なマッピングがあります。 (あなたに与えるものを表現するルートと同様)。

はあなたが達成したいものにかなり近いはずである。この

const commands = { doSomething() { ... }); 

// Then you should be able to say: 
let clientCommand = 'doSomething'; // from client 
commands[clientCommand](param); 

このようなものを持っているかもしれません。 だけdoSomethingが渡された任意のパラメータを検証してください

間接の2つのレベルのために:。

const commandMap = { room: { join() { ...} }, chat: { add() { ... } }}; 
// note this is ES6 syntax 

let clientCmd = 'room'; 
let clientFn = 'join'; 

commandMap[clientCmd][clientFn](); 

私はあなただけのコマンド・マップを置くための適切な場所を見つけなければならないかもしれないと思います。 Webソケットハンドラコードを表示します。

+0

私は何か似たようなものを考えていました。ちょうど2つのレベル(彼らは部屋、チャット、ロジックなどの機能をグループ化できます)。 callObjectオブジェクトの内容は、コールする前にチェックされています(呼び出しが許可されているオブジェクトと存在していることの両方がチェックされています)。私は実際に関数を呼び出すことができないので、関数をチェックすることはできません。 そして、これはもっと厄介なチェックプロセスで悪用される可能性があるので、私は本当にこれにevalを使用したくありません。 –

関連する問題