Ошибка: ошибка экземпляра шаблона
Я пытаюсь отобразить сообщение об ошибке, если 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
,