【问题标题】:Expressjs app.render isn't workingExpressjs app.render 不工作
【发布时间】:2011-08-06 21:59:05
【问题描述】:

当我打电话时

app.get('/', function(req, res)
{
    res.render('index', {locals: {title: 'Hello, Node!' }});
});

输出

TypeError: Object "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
"<html>" + 
"</html>" +
"<title>" + 
title + 
"</title>" +
"<body>" + 
"</body>" +
"<s>" + 
"Hello, World" + 
"</s>" has no method 'call'
    at ServerResponse._render (/usr/local/lib/node/.npm/express/2.2.2/package/lib/view.js:377:21)
    at ServerResponse.render (/usr/local/lib/node/.npm/express/2.2.2/package/lib/view.js:242:17)
    at Object.<anonymous> (/home/william/www/html_public/app.js:36:6)
    at param (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:148:21)
    at pass (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:164:10)
    at Object.router [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/router.js:170:6)
    at next (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/http.js:204:15)
    at Object.bodyParser [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/bodyParser.js:76:7)
    at next (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/http.js:204:15)
    at Object.methodOverride [as handle] (/usr/local/lib/node/.npm/connect/1.3.0/package/lib/middleware/methodOverride.js:35:5)

这是我的快速配置

app.configure(function(){
    app.use(express.methodOverride());
    app.use(express.bodyParser());
    app.use(app.router);
    app.use(express.cookieParser());
    app.set('view engine', 'haml');
    app.set("view options", { layout: false });

    // Set directorys
    app.use(express.static(public_dir));
    app.set('views', __dirname + '/views');
});

我该如何解决这个问题。好像调用了一个不存在的函数??


这是haml代码

!!!
%html
    %title= title

%body
    %s Hello, World

已修复!! 此配置修复了与 haml 库的兼容性

var haml = require('haml');

app.register('.haml', {
    compile: function(str, options) {
        return function(locals) {
            return haml.render(str, {locals: locals});
        }
    }
});

【问题讨论】:

    标签: node.js express haml


    【解决方案1】:

    另外,您使用的是哪个版本的 express / node?尝试升级到最新的稳定版本。

    // render
    var str = view.fn.call(options.scope, options);
    

    这就是呈现您的视图的原因。

    view.fn = engine.compile(view.contents, options)
    

    这就是创建函数的原因。 .compile 在您的 haml 引擎中定义。我猜这是haml引擎中的一个错误,因为那是一个非标准引擎。

    haml 不符合开箱即用的 express。所有 express view 引擎都应该有一个 .compile 函数,它返回一个可以被调用来返回 html 的函数。 haml 中的 .compile 方法不会返回 express 所期望的。

    试试haml-js,这是快递小哥写的,快递小哥维护的。

    或者,如果您阅读app.register 的文档,它会向您展示如何将任何视图引擎转变为快速兼容的视图引擎。

    【讨论】:

    • 不,我用的是haml,那是编译好的html
    • @Will03uk 你可以提到这一点。不需要反对票。
    • 我使用节点 v0.4.5 和 express v2.2.2
    • @will03uk 你的haml视图引擎是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 1970-01-01
    • 2020-02-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多