2016-12-03 6 views
1

Ich verwende node mit express und ich möchte Zugriffsobjekt vom Server gesendet werden. Zum BeispielWie Zugriff auf Objekt vom Server auf Client-Seite

Server-Seite:

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

Client-Seite javascript:

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

Ist das möglich/legitim?

EDIT:

Ich verwende handlebars als Template-Engine.

Irgendwie herausgefunden.

In meinem Fall ist diese Variable aus der Datenbank und ich gebe es basierend auf ID von Antoher Seite gepostet. Aber immer noch, wie kann ich auf es von Javascript zugreifen, nicht nur Form. Hbs-Layout-Datei.

Dann page_to_render haben und ich kann Sie Lenker {{}}, um es zu bekommen.

+0

sollten Sie beachten, welche Template-Sprache Sie –

Antwort

0

Wenn Sie AngularJS als Front-End-Service verwenden, können Sie einen Controller erstellen und ihn $scope und $http injizieren, um die Daten zu erhalten. Zum Beispiel:

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); 
      }); 
    }; 
}); 

Und dann im Frontend, rufen getData().

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

+0

verwenden Ich bin nicht AngularJS oder andere Frameworks, neben Express.js verwenden. – voodoo16

0

Ihre Template-Engine weitergegeben dauern wird, um die Argumente zu diesem Anruf machen und HTML erzeugen (häufig) oder JSON. Es sendet nicht wirklich Objekte, sondern nur Textdaten.

Wenn Sie den Status eines Objekts ändern möchten, das auf der Serverseite vorhanden ist, sollten Sie eine API dafür erstellen. Senden Sie Daten an den Client, nehmen Sie Änderungen an diesen Daten vor und senden Sie sie dann an den Server, damit sie in das ursprüngliche Objekt eingefügt werden können.

+0

Ich möchte nur einige Dinge auf der Clientseite tun und muss kein Objekt zurücksenden. Wie kann ich zum Beispiel mit 'Lenker' darauf zugreifen? Ich meine, dass auf der Client-Seite einige Logik Dinge auf Objekt tun, nicht nur über {{}}. – voodoo16

+0

Wenn Sie ein Beispiel des ursprünglichen Objekts zeigen könnten, und was Sie damit machen möchten, sobald es den Client erreicht, wäre das hilfreich –

+0

Mein Hauptziel ist es, gespeicherte Vorlage zu rendern. Vorlage enthält: Zeilen, Spalten, Array von Größe Zeilen mal Spalten, einige Daten. Jetzt möchte ich dieses Array auf eine nette Art und Weise rendern. Ich weiß, dass ich in 'hbs' nur {{each ...}, aber das ist wie ein 2D-Array, und ich möchte Zeilen und Spalten platzieren. Also misis ich modulo Bedingungsoperation, um auszuwählen, ob es Zeile oder Spalte ist. – voodoo16

1

Sie müssen das Objekt als JSON wie folgt kodieren:

:

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

und dann AJAX auf dem Front-End verwenden, jQuery verwenden Sie

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

oder kürzer verwenden können

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

Werden Daten nicht zweimal gesendet? Erstens, wenn Sie URL im Browser eingeben, zweitens, wenn das Skript gestartet wird? – voodoo16

+0

Ihre HTML-Seite mit Skript sollte nicht '/ some_page /' sein, es ist nur für die Rückgabe von JSON. – jcubic

+0

das ist nicht korrekt. Die Express-Route gibt nicht an, um welchen Rückgabetyp es sich handelt, aber normalerweise handelt es sich um HTML. Das Objekt "data" ist das, was in die Vorlage übergeben wird. –

1

Ja. Dies ist möglich und legitim. Angenommen, Sie EJS verwenden, eine Zeile wie diese zu Ihrer Vorlage hinzu:

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

Wenn Sie einen anderen Template-Engine verwenden, müssen Sie nur die spezifische Syntax nachschlagen, wie Objekte serialisieren.

AjAX ist Overkill für diesen Anwendungsfall.

Verwandte Themen