我正在尝试将带有快速框架应用程序的node.js转换为meteor。 基本上是以https://github.com/onmodulus/demeteorizer
的相反方式答案 0 :(得分:8)
绝对不是自动的,但有很多技巧可以链接到几乎自动获取它。
我已经完成了这一切,这是我的所有技巧。
让我们从您的express app main .js文件开始。这个你需要在顶部添加以下内容:
/server/main.js
:
routes = {};
var app = {
get: function(route, foo) {
// routes.get[route] = foo;
routes[route] = foo;
},
all: function(route, foo) {
// routes.all[route] = foo;
routes[route] = foo;
}
};
所有这一切都是为了定义你需要的app
函数,并在对象中记录定义的路径,我们稍后将使用iron-router
来定义这些路径。因此,这可以确保以下内容记录在routes
:
/server/main.js
:
app.get('/show', function(req, res) {
res.render('mytemplate');
});
这真的是主要的技巧。从这里看它的正义劳动。
在良好的流星风格中,我们将所有路由渲染调用包装成光纤,使它们与流星服务器上的其他所有内容同步。为此,我们定义了一个包装函数waiter
,我们可以反复使用它来包装路由函数。当我们添加它时,我们将按照我们将从流星服务器上的铁路线获得的连接请求和响应按照表达的res
和req
对象来查看。请注意:这一点并不完整。这只是我想从这些对象中使用的签名。
/server/main.js
:
/** 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);
};
var html = Handlebars.templates[name](data);
callback(null, html);
};
res.json = function(object) {
res.send(JSON.stringify(object));
}
res.redirect = function(URL) {
res.writeHead(302, {
'Location': URL
});
res.end();
};
req.header = function(x) {
return this.header[x];
};
TemplatesObject = Handlebars.templates;
// these objects need to be extended further
foo(req, res);
});
return waiter_aux(foo, req, res);
};
最后,真正的交易:为每条指定的快速路线创建路线。为此,我们将使用iron-router。以下代码将遍历每个定义的路由(由我们重新定义的app
函数捕获并存储在routes
中),并使用我们的waiter
将其包装在光纤中,这也将用于处理在this.request
/ this.response
与req
和res
对象之间进行翻译表达应用假设。
/routes.js
:
if (Meteor.isServer) {
// create routes for all the app.get's and app.all's in bibbase.js
// (server)
console.log("setting routes:", routes);
_.each(routes, function(foo, route) {
Router.map(function () {
this.route(route, {
path: route,
where: 'server',
action: function() {
this.request.params = this.params;
var html = waiter(foo, this.request, this.response);
if (!this.response.statusCode) {
this.response.statusCode = 200;
}
if (!this.response.getHeader('Content-Type')) {
this.response
.setHeader('Content-Type', 'text/html');
}
this.response.end(html);
}
});
});
});
}
这些是我为完成你所要求的事所做的最重要的事情。我确定我在这里错过了一些细节,但这应该会给你一个想法。
后空间栏的更新(我忘了那个版本的Meteor):
为了完成这项工作,您现在需要添加handlebars-server:
meteor add cmather:handlebars-server