Я работаю над портированием основного приложения на основе 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>{{name}}</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, будут высоко оценены. В идеале, я хотел бы использовать частичные части в реальном времени, а не предварительно скомпилированный код для простоты. Благодаря!!!