Expressjs app.render не работает - PullRequest
1 голос
/ 16 апреля 2011

Когда я звоню

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

Исправлено !! Эта конфигурация исправляет совместимость сбиблиотека хамла

var haml = require('haml');

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

1 Ответ

2 голосов
/ 16 апреля 2011

Кроме того, какую версию Express / узла вы используете? Попробуйте обновить до последней стабильной версии.

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

Вот что делает ваш взгляд.

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

Вот что создает функцию. .compile определено в вашем движке haml. Полагаю, это ошибка в движке haml, поскольку это нестандартный движок.

хамл не соответствует экспресс-доставке из коробки. Предполагается, что все движки экспресс-представления имеют функцию .compile, которая возвращает функцию, которая может быть вызвана для возврата html. .compile метод в haml не возвращает то, что ожидает экспресс.

try haml-js , который был написан парнями-экспрессами и поддерживается парнями-экспрессами.

В качестве альтернативы, если вы читаете документы для app.register , это показывает, как превратить любой движок представления в движок представления, совместимый с экспрессом.

...