2017-10-27 3 views
0

Ich versuche, Daten aus meiner Datenbank an den Client (EJS-Vorlage) zu übergeben. Die Daten werden jedoch nicht ausgegeben und es werden keine Fehler angezeigt. Also habe ich versucht, die Daten zu meinem Terminal zu console.log und es zeigt, es wird nur nicht auf der ejs-Seite angezeigt.Weitergabe von JSON an EJS

Hier ist mein Code:

<div class="row"> 
    <!-- LOCAL INFORMATION --> 
    <div class="col-sm-6"> 
     <div class="well"> 
      <h3><span class="fa fa-user"></span> Local</h3> 

      <p> 
       <strong>id</strong>: <%= user._id %><br> 
       <strong>email</strong>: <%= user.local.username %><br> 
       <strong>password</strong>: <%= user.local.password %><br /> 
       <strong>text</strong>: <%= text %> 
      </p> 
     </div> 
    </div> 

Hier ist das Backend:

app.get('/profile', isLoggedIn, (req, res) => { 
    var text; 
    MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => { 
     db.collection("data", (err, collection) => { 
     collection.find().toArray((err, res) => { 
      if(err){ 
      throw err; 
      } 
      text = res[0].string; 
      console.log(text); 
     }); 
     }); 
    }); 
    res.render('auth/profile', { 
     user: req.user, 
     text: text 
    }); 
    }); 

Hinweis, dass es eine console.log(text), und das tut Ausgabe den richtigen Text an das Endgerät, habe ich nur Probleme vorbei es bis zum Kunden. Alle Daten des Benutzers werden ebenfalls korrekt ausgegeben.

+0

haben Sie versucht, die Variablen ohne Leerzeichen auszugeben? '<% = user.local.username%>' – turmuka

+0

@turmuka alle Benutzer arbeiten, nur der Text schlägt fehl –

Antwort

2

Sie benötigen res.render innerhalb der Callback von Ihrer Anfrage haben, zum Beispiel:

app.get('/profile', isLoggedIn, (req, res) => { 
    var text; 
    MongoClient.connect("mongodb://localhost:27017/manage", (err, db) => { 
     db.collection("data", (err, collection) => { 
     collection.find().toArray((err, response) => { 
      if(err){ 
      throw err; 
      } 
      text = response[0].string; 
      console.log(text); 
      res.render('auth/profile', { 
      user: req.user, 
      text: text 
      }); 
     }); 
     }); 
    }); 
    }); 

Die Art und Weise haben Sie es Setup jetzt ist es ausgeführt wird, bevor der Rückruf beendet ist und dessen außerhalb des Gültigkeitsbereichs. Außerdem möchten Sie Ihre Datenbankverbindung in der Regel nicht in Ihre Routen einfügen. Sie möchten beim Start des Node-Servers eine Datenbankverbindung herstellen und diese Verbindung dann an Ihre Routen weiterleiten, um die Verbindung erneut zu verwenden. Andernfalls verbinden Sie sich jedes Mal, wenn Ihre Route angefahren wird, wieder mit der Datenbank.

Um hinzuzufügen, möchten Sie auch nicht throw err tun, da dies Ihren Knotenprozess stoppen wird (ich nehme an, Sie verwenden Express?). Stattdessen loggen Sie einfach den Fehler oder machen Sie eine Rückkehr und res.render und fügen Sie den Fehler ein, damit Sie in Ihrer Ansicht damit umgehen können.

Edit:

In Ihrem Rückruf für toArray Sie haben den Namen der Antwort von res zu response oder etwas anderes als res zu ändern, so dass Sie den Server res Objekt nicht außer Kraft setzen.

+0

Notiert über den Fehler, aber ich bekomme den Fehler "res.render ist keine Funktion", wenn ich Platziere es innerhalb der toArrays Funktion –

+0

Auch ich möchte beachten, da die Benutzerdaten korrekt angezeigt werden, glaube ich nicht, dass es die Position von res.render ist, die das Problem verursacht –

+0

@JustinLi Ich habe das Codebeispiel und eine Erklärung aktualisiert . Es ist 100% die Position des 'res.render' - erinnern Sie sich, Knoten ist asynchron, wenn Sie Daten, die von einem Rückruf (d. H. Datenbankabfrage) kommt, müssen Sie innerhalb dieser Rückruf sein. Wie bereits erwähnt, stellen Sie sicher, dass Sie 'res' nicht verwenden, da dies Ihre Server' res'-Variable überschreiben würde. – dzm