2014-04-13 11 views
5

Tôi đang cố gắng chuyển đổi một node.js với ứng dụng khung hiển thị thành thiên thạch. Về cơ bản làm cách ngược của https://github.com/onmodulus/demeteorizerCó cách nào dễ dàng để chuyển đổi ứng dụng Express thành meteor?

+0

lẽ không ở bất kỳ cách tự động nào như các mô hình xây dựng ứng dụng Express và ứng dụng Meteor đều khác nhau. – imslavko

+4

Tôi không biết những người này đã gắn cờ câu hỏi nào muốn. Đối với tôi, nó khá là chen chúc câu hỏi là gì. Nếu không thì tôi có thể trả lời như thế nào? Một câu hỏi không cần phải dài để được rõ ràng. –

Trả lời

8

Chắc chắn không tự động, nhưng có một loạt các thủ thuật bạn có thể chuỗi với nhau để gần nhận được nó tự động.

Tôi đã trải qua điều đó và đây là tất cả các thủ thuật của tôi cho việc này.

Hãy bắt đầu với tệp .js chính của ứng dụng express của bạn. Cái này bạn cần phải thêm những điều sau ở đầu:

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

Tất cả điều này là để xác định app chức năng bạn cần, và ghi lại các tuyến đường quy định tại một đối tượng, mà chúng tôi sẽ sau sử dụng để xác định các tuyến đường đó bằng cách sử dụng iron-router. Vì vậy, điều này làm cho chắc chắn rằng mọi thứ như sau được ghi lại trong routes:

/server/main.js:

app.get('/show', function(req, res) { 
    res.render('mytemplate'); 
}); 

Đó thực sự là chính lừa. Từ đây trên lao động của nó.

Trong phong cách sao băng tốt, chúng tôi sẽ quấn tất cả các cuộc gọi đường dựng hình thành một sợi, để làm cho họ đồng bộ như mọi thứ khác trên máy chủ sao băng. Để làm được điều đó, chúng ta định nghĩa hàm gói waiter mà chúng ta có thể tái sử dụng lặp đi lặp lại để bọc các hàm tuyến đường. Và trong khi chúng ta thêm nó, chúng tôi sẽ xoa bóp theo yêu cầu kết nối và phản ứng mà chúng ta sẽ nhận được từ sắt tìm đường khác trên máy chủ sao băng vào resreq đối tượng express muốn thấy. Tâm trí bạn: điều này là không hoàn thành bởi bất kỳ căng. Nó chỉ là chữ ký tôi muốn sử dụng từ các đối tượng này.

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

Cuối cùng, thực sự đối phó: sáng tạo các tuyến đường đối với từng tuyến đường cao tốc theo quy định. Đối với điều này, chúng tôi sẽ sử dụng iron-router. Mã sau sẽ đi qua từng tuyến đường được xác định (được xác định bởi các chức năng app được xác định lại của chúng tôi và được lưu trữ trong routes) và quấn nó vào một sợi bằng cách sử dụng waiter của chúng tôi, dịch vụ này cũng sẽ xử lý giữa các đối tượng this.request/this.responsereqres ứng dụng giả định.

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

} 

Đây là những điều quan trọng nhất mà tôi đã thực hiện để đạt được những gì bạn đang hỏi về. Tôi chắc rằng tôi đã bỏ lỡ một vài chi tiết ở đây, nhưng điều này sẽ cung cấp cho bạn một ý tưởng.


Cập nhật cho hậu Spacebars (tôi quên phiên bản Meteor đó là):

Để thực hiện việc này, bây giờ bạn cần phải thêm handlebars-server:

meteor add cmather:handlebars-server 
+0

đó là một câu trả lời rất ấn tượng! – imslavko

Các vấn đề liên quan