2016-03-29 9 views
0

Ich versuche, diese Router Antwort asynchron zu machen:Ausführen res.render asynchron in Express App

var express = require('express'), 
    router = express.Router(); 

router.get('/', function(req, res, next) { 
    res.render('contact', { 
    titleShown: true, 
    title: 'Contact' 
    }); 
}); 

Ich versuchte async zu implementieren, die ich über here lesen, aber nicht funktioniert:

var express = require('express'), 
    router = express.Router(), 
    async = require('async'); 

router.get('/', function(req, res, next) { 
    async.parallel([ 
    res.render('contact', { 
     titleShown: true, 
     title: 'Contact' 
    }) 
    ], req); 
}); 

Wie kann ich das machen?

Fehlermeldung, die ich bekam, als ich die --trace-sync-io Flagge:

WARNING: Detected use of sync API 
    at fs.statSync (fs.js:892:18) 
    at tryStat (C:\www\node\website\node_modules\express\lib\view.js:169:15) 
    at resolve (C:\www\node\website\node_modules\express\lib\view.js:142:14) 
    at lookup (C:\www\node\website\node_modules\express\lib\view.js:110:17) 
    at View (C:\www\node\website\node_modules\express\lib\view.js:85:20) 
    at render (C:\www\node\website\node_modules\express\lib\application.js:569:12) 
    at render (C:\www\node\website\node_modules\express\lib\response.js:961:7) 
    at C:\www\node\website\routes\contact.js:9:7 
    at handle (C:\www\node\website\node_modules\express\lib\router\layer.js:95:5) 
+0

was meinst du Antwort asynchron? – gmaliar

+0

Zeile 9 Spalte 9 in contact.js ist 'res.render', deshalb dachte ich, es ist nicht asynchron. Ich habe meine Frage mit der Fehlermeldung aktualisiert. – Lanti

+1

res.render ist bereits asynchron. Wenn Sie tun: 'router.get ('/', (req, res, nächste) => { res.render ('Kontakt', {title: 'Kontakt'}, (err, html) => { console.log ('sendete dieses statische Zeug'); }); console.log ('das ist async'); }); Sie können wahrscheinlich sehen, was "das ist async" Zeichenfolge kann vor "dieses statische Zeug gesendet werden", weil all diese Sachen async ist. – Syberic

Antwort

1

Nein, res.render nicht vollständig asynchron ist (im Moment). So wird der Fehler kommt wirklich von res.render:

Ja, es gibt Sync Teile der res.render API (die saugt), aber es wird in Express 5.0 angesprochen werden, wie wir es nicht ohne Bruch adressieren die Kompatibilität der View-Engine.

Starten Sie Ihre Anwendung mit NODE_ENV = Produktion oder Einstellung des Cache auf true für Rendering wird beim Start nur einmal pro Ansicht Dateisystemaktivitäten verursachen, was dies kein Thema macht, während die Anwendung vollständig in der Produktion läuft, da keine Sync-Dateisysteme aufgerufen werden, da die Ansichten zwischengespeichert werden.

Source

Verwandte Themen