2016-07-05 6 views
0

Ich verwende nodeJS/express als Backend und Jade als Vorlage-Engine. Mein Javascript-Teil benötigt einige Variablen vom Server. Im Allgemeinen kann dies wie folgt geschehen:Wie entkommt man anfängliche JSON-Daten in Jade?

script(type='text/javascript'). 
    var user = !{JSON.stringify(userObject)}; 

alles funktioniert gut, außer dem Fall, wenn userObject<script>[some text]</script> Block hat. Bitte fragen Sie nicht, warum dieser Block in userObject erscheint, weil dies eine interne Sache ist und ich nur diesen Fall behandeln möchte.

Aufgrund der Tatsache, dass der Javascript-Parser früher als der HTML-Parser führt meine Einbettung mit dem Fehler gebrochen wird:

<script> 
    var user = { 
     name: 'Erik', 
     about: '<script>about me</script>' 
    }; 
</script> 

Uncaught SyntaxError: Invalid or unexpected token

Der Fehler tritt aufgrund der about me</script> Linie, weil sie die Haupt <script> schließen Etikett.

Also meine Frage ist: Was ist der richtige Weg, um diesen Fehler zu behandeln?

+0

Wenn wir ähnliche Probleme haben (Apostrophe verursachen in diesem Fall auch Brüche), schreiben wir einen API-Aufruf, um die benötigten Daten zu erhalten und rufen sie mit $ http oder mit ajax in einem Skript-Tag auf. –

+0

Ich mag keine Idee, um Anfangsdaten mit zusätzlicher Anfrage zu erhalten. Was ist, wenn es scheitert? – Erik

+0

Wenn Sie die gleiche Funktion auf demselben Server verwenden, von dem aus Sie Ihre Website bedienen, scheint es unwahrscheinlich, dass es in allen Fällen fehlschlägt, in denen es nicht bereits fehlschlägt. –

Antwort

0

Wenn Sie keinen Endpunkt hinzufügen und eine GET-Anforderung für die Daten ausführen möchten, gibt es zwei weitere grobe Lösungen. Beachten Sie, dass dies Kluddy-Hacks sind. Ich denke immer noch, der beste Weg, dies zu lösen, ist mit einer AJAX-Anfrage an einen API-Endpunkt mit den erforderlichen Daten innerhalb des Tags <script>.

1) Funktionen haben, die die < und > Zeichen ausziehen und sie vor und nach anwenden.

z. Im Express-Endpunkt:

function replaceTags(aboutSection) { 
    aboutSection = aboutSection.replace(/</g, '%StartBracket%'); 
    aboutSection = aboutSection.replace(/>/g, '%CloseBracket%'); 
    return aboutSection; 
} 

In der Client-Seite Code:

function undoReplace(aboutSection) { 
    aboutSection = aboutSection.replace(/%StartBracket%/g, '<'); 
    aboutSection = aboutSection.replace(/%CloseBracket%/g, '>'); 
    return aboutSection; 
} 

ich Regex mit dem g Tag bin mit sicher, dass alles zu machen, nicht nur die erste Instanz wird ersetzt.

2) Wenn Sie den Abschnitt about nicht benötigen, können Sie ihn löschen, bevor Sie ihn an den Endpunkt übergeben.