2016-12-03 3 views
1

nodeexpressを使用していますが、サーバーから送信されるアクセスオブジェクトが必要です。 例えばクライアント側のサーバーで設定したオブジェクトにアクセスする方法

サーバ側:

router.get('/some_page/', (req, res) => { 
    res.render('some_page', { 
     data: {"somevar1":"somevalue", "somevar2":"somevalue2"} 
    }); 
}); 

クライアント側のjavascript:

var objSentFromSrv = ??? // here i want this object and then perform some action on it 

が正当な/これは可能ですか?

EDIT:

私はテンプレートエンジンとしてhandlebarsを使用しています。

どういうわけか分かりません。

function middlewareAppendingLocals(req, res, next) { 
    res.locals.layoutV = myValue; 

    next(); 
} 

router.post('/page/', middlewareAppendingLocals, (req, res) => { 
    res.render('page_to_render'); 
}); 

私のケースでは、この変数はデータベースから来ており、私はantoherページから投稿されたidに基づいています。でも、まだ.hbsレイアウトファイルだけでなく、javascriptからどうやってアクセスすることができますか?

次にpage_to_renderがあります。それを得るために{{}}のバーを処理できます。

+0

使用しているテンプレート言語を書き留めておいてください。 –

答えて

0

フロントエンドサービスとしてAngularJSを使用している場合、コントローラを作成して、$scope$httpを注入してデータを取得できます。例:

var app = angular.module('myApp', []); 

    app.controller('mainController', ($scope, $http) => { 
    $scope.data= {}; 

    $scope.getData = function() { 
     $http.get('/some_route/') 
      .success((data) => { 
       $scope.data = data; 
       console.log(data); 
      }) 
      .error((error) => { 
       console.log(error); 
      }); 
    }; 
}); 

次に、フロントエンドでgetData()と呼び出します。

https://docs.angularjs.org/guide/controller

+0

私は、expressjsの横にAngularJSやその他のフレームワークを使用していません。 – voodoo16

0

あなたのテンプレートエンジンは、そのレンダリングコールに渡される引数を取り、HTML(多くの場合)、またはJSONを生成するために起こっています。実際にオブジェクトを送信するのではなく、テキストデータだけです。

サーバー側に存在するオブジェクトの状態を変更する場合は、そのためのAPIを作成する必要があります。クライアントにデータを送信し、そのデータを変更して元のオブジェクトに組み込むためにサーバーに戻します。

+0

私はちょうどクライアント側でいくつかのことをしたい、そしてオブジェクトを返す必要はありません。だから私はどのように 'ハンドルバー'でそれにアクセスできますか?私は、クライアント側では、オブジェクト上で何かをするロジックがあることを意味し、{{}}でレンダリングするだけではありません。 – voodoo16

+0

元のオブジェクトの例を示すことができ、それがクライアントに到達したら元のオブジェクトの例を表示できれば助かります –

+0

私の主な目標は保存されたテンプレートをレンダリングすることです。テンプレートには次のものが含まれます:rows、cols、サイズの行の配列cols、いくつかのデータを扱う。今私はいくつかの良い方法でその配列をレンダリングしたい。私は 'hbs'では{{each ...}しかできないことを知っていますが、これは2D配列のようなもので、行と列を配置したいと思います。だから私は行または列かどうかを選択するモジュロ条件付き演算をmiisingしています。 – voodoo16

1

あなたはこのようにJSONとしてオブジェクトをエンコードする必要があります。

:あなたは

$.get('/some_page/', function(data) { 
    var objSentFromSrv = JSON.parse(data); 
}); 

または短いを使用できるjQueryのを使用して、

router.get('/some_page/', (req, res) => { 
    res.send(JSON.stringify({ 
     data: {"somevar1":"somevalue", "somevar2":"somevalue2"} 
    })); 
}); 

、その後、フロントエンドでAJAXを使用します

$.getJSON('/some_page/', function(data) { 
    var objSentFromSrv = data; 
}); 
+0

データを2回送信していませんか?最初にブラウザにURLを入力すると、スクリプトが実行を開始する秒数が表示されます。 – voodoo16

+0

あなたのhtmlページのスクリプトは '/ some_page /'であってはなりません。これはJSONを返すためのものです。 – jcubic

+0

が正しくありません。急行ルートは、戻り値の型を示すものではありませんが、通常はHTMLです。 「データ」オブジェクトは、テンプレートに渡されるオブジェクトです。 –

1

はい。これは可能で正当なものです。あなたがEJSを使用していると仮定すると、あなたのテンプレートに、このような行を追加します。

<script> 
    const objSentFromSrv = <%-JSON.stringify(data)%>; 
</script> 

あなたは別のテンプレートエンジンを使用している場合は、オブジェクトをシリアル化する方法についての具体的な構文をルックアップする必要があるだけでしょう。

このユースケースの場合、AjAXは過剰です。

関連する問題