错误:模板实例错误实例化

时间:2017-06-28 08:32:24

标签: d vibed

如果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 个答案:

答案 0 :(得分:1)

如果您查看error instantiating上方的错误,您会看到vibe.d所在的父类的init tries to call render!方法调用,但是你的代码没有父类。

这意味着目前您无法在类{}之外的errorDisplay调用的函数中呈现任何模板。事实上,在将&((new NewWebService).myStuff传递给router.any时,errorDisplay根本不起作用(错误?)。 vibe.d存储库中的所有示例都使用带有errorDisplay的类。

您可以将getStuffshowPageNotFound包装在一个类中,但是router.any("*", ...不可能,因为它仅用于单个函数,@path属性不与registerWebInterface一起使用时支持通配符。

解决这个问题的方法不是抛出异常,而是在myStuff内渲染错误。虽然我很差,但我认为你想使用errorDisplay

更好的解决方案是在vibe.d中实现功能,将req参数传递给errorDisplay调用的函数(修复错误?errorDisplay无法使用在@path使用时registerWebInterface支持通配符,甚至更好。