2017-01-09 3 views
3

私はバックエンドに "javascript関数"を渡したいと思います。私はajaxを使用しています。 これは短い例である:それは機能だからAJAXを介してjs関数を送信

var data = { 
    prop: function (e) { alert(e) } 
}; 
ajax.(..., data: data, dataType: "json")... 

これは、自動的にデータからpropを削除します。

jsonでバックエンドにこの関数を渡すにはどうすればよいですか?それを文字列に変換せずに。

+2

テキスト/文字列として送信する以外の方法はありません – hindmost

+4

質問はなぜですか?なぜ、バックエンドに関数を送信したいのですか? – Rajesh

+0

次の回答は役に立ちます http://stackoverflow.com/questions/3946958/pass-function-in-json-and-execute –

答えて

5

あなたは本当には、クライアントからサーバに送信機能と、サーバー上ではなく、セキュリティチェックの多くせずにその機能を実行する必要はありません。あなたはクライアントから受け取ったものを信用できないことを覚えて、しばらくそれを考えてください。それとは別に、サーバーは既に必要なことを行う方法を知っているはずです。通常はあなたが代わりにやっていることは、その機能を使用するように指示するコマンド(文字列)を送ることです(既に持っているので、あなたは信頼することができます)。

しかし、あなたが先に行くと、とにかくことをしたい場合:

文字列に変換せずに。

できません。唯一の方法は、最終的にテキストベースのプロトコルであるHTTP経由で送信できるソースコードまたはその他の形式として関数を送信することです。だからあなたはソースコードを送信するか、それをあなた自身のバイトコードの何らかのバイトコードにコンパイルし、それを送信します(おそらくBase64などの文字列に変換されます)。

ES2015では、

var dataToSend = {prop: data.prop.toString()}; 
ajax(..., data: JSON.stringify(dataToSend), dataType: "json") 

サーバはその文字列をコンパイルし、その結果を実行する必要があります:関数は、あなたがその文字列を送ることができるように、有効な関数宣言や表現の形式をとりtoStringを持つことが必要とされています。 JavaScriptはそれを行う方法を提供しますが(eval)、再度:非常に危険なクライアントから受け取ったコードを実行するにはです。非常に危険なことを行うには、まず多くの安全点検を行う必要があります。

0

現在のJavaScriptのバージョンは<です。JSON.stringify()などの関数を使用してES2015をネイティブでサポートしていませんが、モジュール用にNPMまたは別のパッケージマネージャを使用している場合はインストールできます。

このパッケージは、と呼ばれ、関数、正規表現などを文字列表現に変換するために使用できるserialize関数を追加しています。その後、サーバー側でevalを使用できます。

関連する問題