2014-04-13 29 views
5

我想用express框架應用程序將node.js轉換爲流星。 本質上做的https://github.com/onmodulus/demeteorizer有沒有一種簡單的方法將一個快速應用轉換爲流星?

+0

可能不是任何建立快車應用程序和流星應用程序的模型都是如此不同。 – imslavko

+4

我不知道這些標記問題的人想要什麼。對我來說,問題是什麼都很好。如果不是那麼我怎麼能夠回答它?爲了清楚起見,問題不需要太長。 –

回答

8

絕對不會自動反轉方式,但也有竅門的一堆你可以鏈在一起幾乎自動獲得它。

我已經經歷了這一切,這裏是我的所有技巧。

讓我們從您的快速應用主.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); 
}; 

最後,實打實的:創建每個指定的快遞路線的路線。爲此,我們將使用iron-router。下面的代碼將通過每個定義的路徑(由我們重新定義app功能捕獲並存儲在routes),並使用我們waiter敷在纖維,這也將採取this.request/this.responsereqres對象之間進行轉換的護理表達應用假設。

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

} 

這是最重要的事情,我對我所做的完成你問什麼。我確定我在這裏錯過了一些細節,但這應該給你一個想法。


更新後Spacebars(我忘了​​流星的版本,這是):

爲了使這項工作,你現在需要添加handlebars-server

meteor add cmather:handlebars-server 
+0

這是一個非常令人印象深刻的答案! – imslavko

相關問題