Ошибка: ошибка экземпляра шаблона

Я пытаюсь отобразить сообщение об ошибке, если req был слишком коротким. Вот код:

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);
}

Ошибка:

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

Если я делаю:

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

Я получаю ошибку: Error: undefined identifier 'res'

1 ответ

Решение

Если вы посмотрите на ошибку выше error instantiating один, вы увидите, что vibe.d пытается позвонить init метод родительского класса, где render! называется, однако ваш код не имеет родительского класса.

Это означает, что в настоящее время вы не можете визуализировать шаблоны в функциях, вызываемых errorDisplay которые вне класса. На самом деле, при прохождении &((new NewWebService).myStuff в router.any, errorDisplay не работает вообще (ошибка?). Все примеры в vibe.d хранилище использовать класс с errorDisplay,


Вы могли бы обернуть getStuff а также showPageNotFound внутри класса, но потом router.any("*", ... это не возможно, так как это только для отдельных функций, и @path Атрибут не поддерживает подстановочные знаки при использовании с registerWebInterface,

Решение этой проблемы было бы вместо того, чтобы генерировать исключение, визуализировать ошибку внутри myStuff, Хотя и плохой, как я думаю, вы хотели использовать errorDisplay,

Лучшим решением будет реализация функциональности в vibe.d пройти req параметр для функций, вызываемых errorDisplay (и исправление ошибки? что errorDisplay не может использоваться вне класса), или, что еще лучше, поддержка подстановочных знаков в @path при использовании с registerWebInterface,

Другие вопросы по тегам