2016-04-09 7 views
0

Ich denke, ich bin ein wenig verwirrt, wie globale Variablen in Nodejs arbeiten. Ich habe diesen Code:Verwirrung über globale Variablen und wie man sie benutzt

var jsreport = require('jsreport-core')() 
var fs = require('fs'); 
var path = require('path'); 
// make sure to pass the path to your `helper.js` 
var helpers = fs.readFileSync(path.join('/Development/jsreport-new/data/templates/Sample report', 'helpers.js'), 'utf8'); 

var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8'); 
var json = JSON.parse(data); 
jsreport.init().then(function() { 
    return jsreport.render({ 
     template: { 
      scripts: [{ 
       content: "request.data={endpoints: json }; done();" 
      }], 
      content: fs.readFileSync(path.join('/Development/jsreport-new/data/templates/Sample report', 'content.handlebars'), 'utf8'), 
      helpers: helpers, 
      engine: 'handlebars', 
      recipe: 'phantom-pdf', 
      phantom: { 
       "orientation": "portrait", 
       "format": "A3",  
       "margin": "3cm", 
       "headerHeight": "3cm" 
      }, 
     }, 
     data: { 
      "books": [ 
       {"name": "A Tale of Two Cities", "author": "Charles Dickens", "sales": 351}, 
       {"name": "The Lord of the Rings", "author": "J. R. R. Tolkien", "sales": 125}, 
       {"name": "The Da Vinci Code", "author": "Dan Brown", "sales": 255}, 
       {"name": "The Hobbit", "author": "J. R. R. Tolkien", "sales": 99}, 
       {"name": "Carlskii", "author": "J. R. R. Tolkien", "sales": 99} 
      ] 
     } 
    }).then(function(resp) { 
     //prints pdf with headline Hello world 
     console.log(resp.content.toString()) 
     resp.result.pipe(fs.createWriteStream('helloworld4.pdf')); 
     setTimeout(function() { 
      process.exit(); 
     }, 3000) 
    }); 
}).catch(function(e) { 
    console.log(e) 
}); 

Ich brauche die JSON-Daten zu übergeben, die von einer lokalen Datei in einer jsreport Vorlage zu lesen. d. h. es muss an den Inhalt innerhalb der Vorlage übergeben werden content: "request.data={endpoints: json }; done();"

Ich bekomme jedoch nur [Error: json is not defined].

Ich versuchte dann, die json Variable als globale Variable zu definieren. z.B. global.json = JSON.parse(data);, aber es macht jetzt Unterschied.

Antwort

2

Ihre json Variable ist hier nicht wirklich global. Es ist lokal für den Bereich Ihres Knotenmoduls und keine anderen Module können darauf zugreifen.

Das bedeutet, dass Ihr Bericht "request.data={endpoints: json }; done();" aus seinem eigenen Bereich analysiert und json nicht ausführt.

Um Ihre Frage zu beantworten, wenn Sie globale Variablen verwenden, ist die leicht snarky aber gültige Antwort "nie". Das Verwalten der Datenverfügbarkeit wird immer empfohlen. Stattdessen empfehle ich, dass Sie die JSON-Daten direkt in den Kontext-Wert einfügen:

+0

fügen Sie Zitate um 'JSON.stringify (json)' hinzu. – alexmac

+0

Vielen Dank für diese und die detaillierte Erklärung, was falsch gelaufen ist. Also ich denke, das Bit, das ich immer noch nicht verstehe, ist, warum die JSON-Variable für "JSON.Stringify" verfügbar ist? – user1513388

+0

Gerne helfen! Die 'json'-Variable ist hier verfügbar, weil sie im Kontext des eigenen Moduls ausgeführt wird, bevor das' scripts'-Array an JsReport übergeben wird. Beachten Sie, dass der Wert der Eigenschaft content, die Sie bereitstellen, eine Zeichenfolge ist, bei der es sich um Code und keine Funktion handelt. Diese fragwürdige Anforderung von den Erstellern von JsReport ist, warum dieser Code losgelöst von seiner Schließung ausgeführt werden muss. Indem Sie Ihre Variable in eine Zeichenkette serialisieren und sie in das Berichtsskript _verfügen_ verbinden, bevor wir sie an JsReport übergeben, können wir die Daten während der Wiedergabe nach den ungewöhnlichen Regeln von JsReport senden. – Mark

0

Ich habe nie node.js aber basierend auf den Ergebnissen

[Error: json is not defined].

Ich führte mich das Problem zu glauben, bezieht sich auf die folgende

var data = fs.readFileSync(path.join('/Development/jsreport-new', 'scratch.json').toString(), 'utf8'); 
var json = JSON.parse(data); 

json Wert nicht gegeben, da die Daten nicht deklarieren oder zumindest nicht richtig deklarieren.

Ich schlage vor, Sie schreiben den Wert der Daten in die Konsole, dann finden Sie es von dort.

console.log(data);