一尘不染

是否有将Express应用程序转换为流星的简单方法?[关闭]

node.js

我正在尝试将带有express框架应用程序的node.js转换为流星。实质上是执行https://github.com/onmodulus/demeteorizer的相反方法


阅读 179

收藏
2020-07-07

共1个答案

一尘不染

绝对不是自动的,但是您可以将许多技巧结合在一起以 几乎 自动获得它。

我已经经历过了,这是我所有的窍门。

让我们从您的Express应用程序主.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,可以反复使用它来包装路由函数。虽然我们添加它,我们将按摩连接请求和响应,我们将得到流星服务器上的铁干道上resreq对象表达想看到的。请注意:这还算是完整的。只是我想从这些对象中使​​用的签名。

/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);
};

最后,真正的交易:为每个指定的特快航线创建航线。为此,我们将使用铁路由器。以下代码将遍历每个定义的路径(由我们的重新定义app函数捕获并存储在中routes),并使用our将其包装在光纤中waiter,这还将照顾在this.request/
this.response和Express应用程序假定的reqres对象之间进行转换。

/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
2020-07-07