如果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'
答案 0 :(得分:1)
如果您查看error instantiating
上方的错误,您会看到vibe.d
所在的父类的init
tries to call 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
支持通配符,甚至更好。