2014-08-29 4 views
0

Я работаю над портированием основного приложения на основе Express для Meteor. Отличное сообщение Is there an easy way to convert an express app to meteor? было отличным началом, используя функцию официанта для переноса маршрутов железных маршрутизаторов, которые Meteor ожидает в req/res, которые нравятся Express.Porting Express App to Meteor

Однако я ударил ошибку, на которой я застрял. Я не могу заставить Meteor передать объект res.render на мой движок шаблонов рулей.

Например:

main.js

app.get('/complex', function(req, res){ 
    var data = { 
    name: 'Gorilla', 
    address: { 
     streetName: 'Broadway', 
     streetNumber: '721', 
     floor: 4, 
     addressType: { 
     typeName: 'residential' 
     } 
    } 
    }; 
res.render('complex', data); 
}); 

Когда/сложный маршрут вызывается через железо-маршрутизатор, он направляется к функции res.render ниже

/** create an sync version for meteor */ 
waiter = function(foo, req, res) { 
    var waiter_aux = Meteor._wrapAsync(function(foo, req, res, callback) { 

    res.set = function(header, value) { 
     res.setHeader(header, value); 
    }; 

    res.send = function(codeorhtml, html) { 
     if (html) { 
      // two arguments provided, treat as described 
      res.statusCode = codeorhtml; 
     } else { 
      // no code, just html 
      html = codeorhtml; 
     } 
     callback(null, html); 
    }; 

    res.render = function(name, data, callback) { 
     callback = callback || function(err, html) { 
      res.send(html); 
     }; 

     console.log(name); // complex 
     console.log(data); // Gorilla... 
     var html = Handlebars.templates[name](data); // THIS ERRORS OUT 
     html = JSON.stringify(name) + " " + JSON.stringify(data) // WORKS 
     callback(null, html); 
    }; 
    ... 

В вышеприведенном сообщении компилятор ошибочно говорит о том, что Handlebars не определено.

W20140828-22:47:49.439(-7)? (STDERR) TypeError: Cannot call method 'complex' of undefined 
W20140828-22:47:49.439(-7)? (STDERR)  at ServerResponse.res.render (app/server/myapp.js:57:50) 
W20140828-22:47:49.440(-7)? (STDERR)  at app/server/myapp.js:298:25 

Я использовал пакет Рули НПМ строить скомпилированные шаблоны (пример ниже), но у меня не было никакой удачи заставить его работать правильно

(function() { 
    var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {}; 
    templates['complex'] = template({"compiler":[6,">= 2.0.0-beta.1"],"main":function(depth0,helpers,partials,data) { 
    var helper, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression; 
    return "\n<p>\nThe data that was passed to `res.render` is:\n<code>var data = {name: 'Gorilla'};</code>\n</p>\n\n<p>\nWe can display the value of <em>name</em> using <code>&#123;&#123;name&#125;&#125;</code>, which results in: <b>" 
    + escapeExpression(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : helperMissing),(typeof helper === functionType ? helper.call(depth0, {"name":"name","hash":{},"data":data}) : helper))) 
    + "</b>.\n</p>\n"; 
},"useData":true}); 
})(); 

Даже идя простейший маршрут определения локальный шаблон

query_string = "<code>var data = {name: 'Gorilla'};</code><p>{{data}}</p>" 
template = Handlebars.compile(query_string) 

приводит к ошибке:

W20140828-21:51:47.126(-7)? (STDERR) TypeError: Object function exphbs(config) { 
W20140828-21:51:47.128(-7)? (STDERR)  return exphbs.create(config).engine; 
W20140828-21:51:47.129(-7)? (STDERR) } has no method 'compile' 

Любые предложения или примеры того, как я могу успешно передать объект документа JSON с Handlebars для рендеринга внутри Meteor/Express, будут высоко оценены. В идеале, я хотел бы использовать частичные части в реальном времени, а не предварительно скомпилированный код для простоты. Благодаря!!!

ответ

1

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

0

Для того, чтобы мой предыдущий ответ на работу, вам нужно добавить handlebars-server:

meteor add cmather:handlebars-server