2017-06-28 7 views
1

Ich versuche Fehlermeldung angezeigt, wenn req zu kurz war. Hier ist der Code:Fehler: Vorlageninstanz Fehler Instanziieren

import std.stdio; 
import vibe.d; 

Database mydatabase; 
void main() 
{ 
    // ... 
    router.get("*", &myStuff); // all other request 
    listenHTTP(settings, router); 

    runApplication(); 

} 

@errorDisplay!showPageNotFound 
void myStuff(HTTPServerRequest req, HTTPServerResponse res) // I need this to handle any accessed URLs 
{ 
    if(req.path.length > 10) 
    { 
    // ... 
    } 

    else 
    { 
     throw new Exception("Nothing do not found"); 
    } 
} 

void showPageNotFound(string _error = null) 
{ 
    render!("error.dt", _error); 
} 

Der Fehler ist:

source\app.d(80,2): Error: template instance app.showPageNotFound.render!("error.dt", _error).render!("app", "app.showPageNotFound") error instantiating

Wenn ich tue:

void showPageNotFound(string _error = null) 
{ 
    res.render!("error.dt", _error); 
} 

Ich erhalte Fehler: Error: undefined identifier 'res'

Antwort

1

Wenn Sie schauen bei dem Fehler über der error instantiating ein, werden Sie vibe.dtries to callinit Methode der Elternklasse, wo render! genannt wird, hat jedoch den Code keine übergeordnete Klasse sehen, dass.

Dies bedeutet, dass Sie derzeit von errorDisplay, die außerhalb einer Klasse mit dem Namen aller Vorlagen in Funktionen nicht machen können. Tatsächlich passiert zu router.any, errorDisplay überhaupt nicht funktioniert (Bug?). Alle Beispiele in vibe.d Repository verwenden eine Klasse mit errorDisplay.


Sie könnten getStuff und showPageNotFound innerhalb einer Klasse wickeln, aber dann router.any("*", ... ist keine Möglichkeit, da es nur für einzelne Funktionen ist, und @path Attribut Platzhalter nicht unterstützt, wenn sie mit registerWebInterface verwendet.

Lösung zu diesem wäre statt Ausnahme zu werfen, den Fehler innerhalb myStuff rendern. Trotzdem ein schlechter, wie ich denke, Sie wollten errorDisplay verwenden.

Eine bessere Lösung wäre die Umsetzung Funktionalität in vibe.dreq Parameter zu Funktionen von errorDisplay genannt passieren (und einen Fehler zu beseitigen? Dass errorDisplay kann nicht außerhalb einer Klasse verwendet werden), oder noch besser, Unterstützung von Wildcards in @path wenn verwendet mit registerWebInterface.

Verwandte Themen