Error: template instance error instantiating

Error: template instance error instantiating

如果 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'

如果您查看 error instantiating 上面的错误,您会看到父 class 的 vibe.d tries to call init 方法在哪里render! 被调用,但是您的代码没有父 class.

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


您可以将 getStuffshowPageNotFound 包装在 class 中,但是 router.any("*", ... 是不可能的,因为它仅用于单个函数,并且 @path 属性在与 registerWebInterface.

一起使用时不支持通配符

对此的解决方案不是抛出异常,而是在 myStuff 中呈现错误。尽管很差,但我认为您想使用 errorDisplay.

更好的解决方案是在 vibe.d 中实现功能,将 req 参数传递给 errorDisplay 调用的函数(并修复一个错误?errorDisplay 不能在 class 之外使用,或者更好的是,当与 registerWebInterface.

一起使用时,支持 @path 中的通配符