2012-08-03 34 views
18

Tôi đang lên kế hoạch sử dụng Meteor cho một ứng dụng ghi nhật ký thời gian thực cho các yêu cầu khác nhau, tôi sẽ chuyển một thông điệp tường trình theo yêu cầu Tham số (POST hoặc GET) từ các ứng dụng khác nhau và Meteor cần cập nhật một bộ sưu tập. Tôi cần truy cập Yêu cầu tham số trong mã máy chủ Meteor và cập nhật bộ sưu tập Mongo với logMessage đến. Tôi không thể cập nhật Mongo Collection trực tiếp từ các ứng dụng hiện có, vì vậy xin vui lòng không có trả lời cho thấy giống nhau. Tôi muốn biết làm thế nào tôi có thể làm điều đó từ khung Meteor và không làm điều đó bằng cách thêm nhiều gói.Làm cách nào để truy cập vào Yêu cầu tham số trong Meteor?

+0

Tôi không chắc chắn nếu nó có thể truy cập vào Node.js dụ cơ bản. Nhưng nếu bạn bằng cách nào đó có thể nắm giữ nó, một 'app.post ('/', hàm (yêu cầu, phản hồi) {});' sẽ thực hiện thủ thuật. Chỉ là một ý tưởng, tôi thực sự không có ý tưởng nếu điều này là có thể. –

Trả lời

0

Vì mọi thứ không hỗ trợ định tuyến phía máy chủ hoặc các hành động cụ thể ở phía máy chủ khi URL bị truy cập. Vì vậy, nó không phải dễ dàng để làm những gì bạn muốn. Đây là một vài gợi ý.

  1. Bạn có lẽ có thể đạt được những gì bạn muốn bằng cách mượn các kỹ thuật được sử dụng bởi các gói oauth2 trên cành auth: https://github.com/meteor/meteor/blob/auth/packages/accounts-oauth2-helper/oauth2_server.js#L100-109

    Tuy nhiên điều này là không thực sự hỗ trợ vì vậy tôi không chắc chắn đó là một tốt ý kiến.

  2. Các ứng dụng khác của bạn thực sự có thể cập nhật bộ sưu tập bằng DDP. Điều này có lẽ dễ hơn là âm thanh.

  3. Bạn có thể sử dụng ứng dụng trung gian chấp nhận yêu cầu POST/GET và trao đổi với máy chủ sao băng bằng DDP. Đây có lẽ là điều dễ dàng nhất về kỹ thuật để làm.

+0

Trên thực tế, Meteor Router _does_ xử lý các tuyến phía máy chủ bên cạnh các tuyến phía máy khách phổ biến hơn. Xem tài liệu trên trang github của nó: https://github.com/tmeasday/meteor-router –

+1

Haha, bạn đúng, nhưng khi tôi viết câu trả lời này tôi chưa thêm chức năng đó vào Bộ định tuyến;) –

9

Tôi tìm thấy một workaround để thêm một router đến các ứng dụng Meteor để xử lý yêu cầu tùy chỉnh.

Nó sử dụng phần mềm trung gian kết nối bộ định tuyến được vận chuyển với thiên thạch. Không phụ thuộc thêm!

Đặt số này trước/ngoài Meteor.startup trên Máy chủ. (Coffeescript)

SomeCollection = new Collection("...") 
fibers = __meteor_bootstrap__.require("fibers") 
connect = __meteor_bootstrap__.require('connect') 
app = __meteor_bootstrap__.app 

router = connect.middleware.router (route) -> 
    route.get '/foo', (req, res) -> 
    Fiber() -> 
     SomeCollection.insert(...) 
    .run() 
    res.writeHead(200) 
    res.end() 
app.use(router) 
+0

Điều này nên được ghi lại tại docs.meteor.com (ít nhất là cho đến khi có giải pháp chính thức hơn) @Geoff –

+0

thêm thông tin sau nếu bạn muốn sử dụng truy vấn tự động và phân tích cú pháp nội dung: app.use (connect.query()) .use (connect.bodyParser()) –

+1

Lưu ý: 0,6.0 điều này sẽ không hoạt động - mặc dù nhìn vào NPM.require ('...'); – emgee

12

EDIT: cập nhật để sử dụng Iron Router, sự kế thừa cho Meteor Router.

Install Iron Router và xác định một lộ trình server-side:

Router.map(function() { 
    this.route('foo', { 
    where: 'server', 
    action: function() { 
     doSomethingWithParams(this.request.query); 
    } 
    }); 
}); 

Vì vậy, đối với một yêu cầu như http://yoursite.com/foo?q=somequery&src=somesource, biến this.request.query trong hàm trên sẽ là { q: 'somequery', src: 'somesource' } và do đó bạn có thể yêu cầu các thông số cá nhân qua this.request.query.qthis.request.query.src và những thứ tương tự. Tôi đã chỉ thử nghiệm các yêu cầu GET, nhưng POST và các loại yêu cầu khác sẽ hoạt động giống hệt nhau; nó hoạt động như Meteor 0.7.0.1. Đảm bảo bạn đặt mã này bên trong một khối Meteor.isServer hoặc trong một tệp trong thư mục /server trong dự án của bạn.

Original Post:

Sử dụng Meteorite để cài đặt Meteor Router và xác định một lộ trình server-side:

Meteor.Router.add('/foo', function() { 
    doSomethingWithParams(this.request.query); 
}); 

Vì vậy, đối với một yêu cầu như http://yoursite.com/foo?q=somequery&src=somesource, biến this.request.query trong hàm ở trên sẽ là { q: 'somequery', src: 'somesource' } và do đó bạn có thể yêu cầu thông số riêng lẻ qua this.request.query.q một nd this.request.query.src và các loại tương tự. Tôi đã chỉ thử nghiệm các yêu cầu GET, nhưng POST và các loại yêu cầu khác sẽ hoạt động giống hệt nhau; nó hoạt động như Meteor 0.6.2.1. Đảm bảo bạn đặt mã này bên trong một khối Meteor.isServer hoặc trong một tệp trong thư mục /server trong dự án của bạn.

Tôi biết người hỏi không muốn thêm gói, nhưng tôi nghĩ rằng việc sử dụng Meteorite để cài đặt Meteor Router vẻ như với tôi một cách tương lai chứng minh hơn để thực hiện điều này khi so sánh với việc tiếp cận đối tượng Meteor không có giấy tờ nội bộ như __meteor_bootstrap__. Khi Package API được hoàn thành trong một phiên bản tương lai của Meteor, quá trình cài đặt Meteor Router sẽ trở nên dễ dàng hơn (không cần Meteorite) nhưng không có gì khác có thể thay đổi và mã của bạn có thể tiếp tục hoạt động mà không cần sửa đổi.

+0

Theo Bộ định tuyến Sắt> = 1.0, 'this.request.query' đã không được dùng nữa cho' this.params.query' – mrkre

+0

@ Geoffrey-Booth Tôi đã cố gửi dữ liệu từ lá chắn GSM và dòng mã này có GET tôi sẽ chỉ chuyển nó cho một POST mặc dù là có một nhu cầu cho một 'Meteor.call (' POST '' hoặc là Iron Router đã đối phó với điều này? 'Char request [] = "GET /test-get-post.php ? a = 1 & b = 2 HTTP/1.1 \ r \ nMáy chủ: test.libelium.com \ r \ nĐộ dài nội dung: 0 \ r \ n \ r \ n "; ' – mjwrazor

2

Sử dụng IronRouter, nó rất dễ dàng:

var path = IronLocation.path(); 
Các vấn đề liên quan