2016-04-06 3 views
0

Ich habe diese Express-Anwendung mit mongoDB als Datenbank und Lenker als meine serverseitige Templating-Engine. Ich verwende AngularJS oder Ajax nicht in meiner Anwendung.Res.Render verwenden und gleichzeitig über eine JSON-Datei senden

In einer der Routen, muss ich die Seite rendern sowie über eine JSON-Datei aus der Datenbank senden. Dies kann ich jedoch nicht erreichen.

Dies ist mein Code-Schnipsel aus durch Route:

router.get('/disks', function(req, res, next) { 

     var risime; 

    places.find({"category": "disks"}, function(err, disk){ 
     if(err){ 
     throw err; 
     } 

     risime= disk; 
     console.log(risime); //PROPERLY LOGS THE OUTPUT 

    }); 

    res.render('diskPage', 
    { 
     'disks': risime 
    }); 

}); 

In den hbs, ich versuche, es zu erfassen, aber ich bin nicht die json Daten bekommen:

var clrisime= "{{risime}}" 
    console.log(clrisime); // DOES NOT LOG ANYTHIN 

Wie kann ich mach es möglich?

+6

Setzen Sie 'res.render()' in den Callback ... – Scimonster

Antwort

5

Sie zwei einfache Fehler gemacht:

router.get('/disks', function(req, res, next) { 

    var risime; 

    places.find({"category": "disks"}, function(err, disk){ 
     if(err){ 
     throw err; 
     } 

     risime= disk; 
     console.log(risime); //PROPERLY LOGS THE OUTPUT 

     // this belongs inside your db callback 
     res.render('diskPage', 
     { 
      'disks': risime 
      // if you call your field 'disks' here, you need to write {{disks}} in your template 
     }); 
    }); 


}); 
  1. Da Ihr wollen die Datenbank Ergebnis in Ihrer Antwort zu verwenden, müssen Sie die res.render innerhalb der Callback setzen.
  2. Der Variablenname in Ihrer Vorlage und der Feldname des Renderobjekts müssen übereinstimmen.
1

Ihr Code wird asynchron ausgeführt. Das bedeutet, dass places.find und res.render fast zur gleichen Zeit ausgeführt werden (~ 10ms max) und das Rendern vor der place.find erfolgt. Sie haben also logischerweise nicht die Daten im Rendering.

Sie müssen Ihren zweiten Teil des Codes innerhalb des Rückrufs der Auflösung des ersten condiiton (places.find) platzieren, wie in:

router.get('/disks', function(req, res, next) { 
    var risime; 
    places.find({"category": "disks"}, function(err, disk){ 
    if(err){ 
    throw err; 
    } 
    risime= disk; 
    console.log(risime); //PROPERLY LOGS THE OUTPUT 
    res.render('diskPage', 
    { 
    'disks': risime 
    }); 
}); 

Und es wird funktioniert, wenn du {{Scheiben}} anstelle von {{risime}} aus Ihrer Sicht.

Verwandte Themen