2012-08-03 36 views
18

我打算使用Meteor作爲各種實時日誌記錄應用程序 我的要求很簡單,我將通過日誌消息作爲請求來自各種應用程序的參數(POST或GET)和Meteor需要簡單地更新集合。 我需要訪問Meteor服務器代碼中的請求參數,並使用傳入的logMessage更新Mongo集合。我無法直接從現有的應用程序更新Mongo Collection,所以請不要提供相同的建議。我想知道如何從Meteor框架中做到這一點,而不是通過添加更多軟件包來做到這一點。如何訪問流星中的請求參數?

+0

我不知道是否有可能訪問底層的node.js實例。但是,如果你能以某種方式獲得它,一個快速的'app.post('/',function(request,response){});'就可以做到這一點。 只是一個想法,但我真的不知道這是否可能。 – 2012-08-03 16:12:32

回答

0

就目前情況而言,當URL被擊中時,服務器端路由或特定操作不受支持。所以要做你想做的事情並不容易。這裏有一些建議。

  1. 你大概可以達到你想要的東西通過借款所使用的oauth2包放在AUTH分支技術:https://github.com/meteor/meteor/blob/auth/packages/accounts-oauth2-helper/oauth2_server.js#L100-109

    然而,這是不是真的支持,所以我不能確定這是一個好理念。

  2. 您的其他應用程序實際上可以使用DDP更新集合。這可能比聽起來容易。

  3. 您可以使用接受POST/GET請求並使用DDP與流星服務器通話的中間應用程序。這可能是技術上最簡單的事情。

+0

實際上,流星路由器_does_除了處理更常見的客戶端路由之外,還處理服務器端路由。看到它的github頁面上的文檔:https://github.com/tmeasday/meteor-router – 2013-05-13 06:14:47

+1

哈哈,你當然是對的,但是當我寫這個答案我還沒有添加到路由器的功能;) – 2013-05-13 07:11:20

9

我找到了一個解決方法,以路由器添加到流星應用程序來處理自定義的請求。

它使用與流星一起發貨的連接路由器中間件。沒有額外的依賴!

把這個之前/之外 Meteor.startup在服務器上。 (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

這應該記錄在docs.meteor.com(至少直到更正式的解決方案出來:) @Geoff – 2012-10-10 22:24:40

+0

如果您想要使用自動查詢和正文解析,請添加以下內容: app.use(connect.query()) .use(connect.bodyParser()) – 2013-01-18 07:17:06

+1

注意:從0.6.0開始,這將不起作用 - 儘管查看NPM.require('...'); – emgee 2013-04-19 10:23:43

12

編輯:更新使用Iron Router,繼任者流星路由器。

Install Iron Router並定義一個服務器端路線:

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

所以對於像http://yoursite.com/foo?q=somequery&src=somesource的請求時,在該函數的可變this.request.query上面會{ q: 'somequery', src: 'somesource' },因此就可以通過this.request.query.qthis.request.query.src請求各個參數等等。我只測試了GET請求,但POST和其他請求類型應該工作相同;這適用於Meteor 0.7.0.1。請確保將此代碼放置在項目的Meteor.isServer區塊或/server文件夾的文件中。

原貼:

使用Meteorite安裝Meteor Router並定義一個服務器端的路線:在功能

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

因此,對於像http://yoursite.com/foo?q=somequery&src=somesource的請求,變量this.request.query以上將是{ q: 'somequery', src: 'somesource' },因此您可以通過this.request.query.q請求個別參數nd this.request.query.src等。我只測試了GET請求,但POST和其他請求類型應該工作相同;這適用於Meteor 0.6.2.1。請確保將此代碼放置在項目的Meteor.isServer區塊或/server文件夾的文件中。

我知道提問者不希望添加包,但我覺得用Meteorite安裝Meteor Router在我看來,實現這個與訪問像__meteor_bootstrap__內部無證流星對象作爲一個更面向未來的方式。當Package API在Meteor的未來版本中完成時,安裝Meteor Router的過程將變得更加容易(不需要Meteorite),但沒有其他可能會改變,並且您的代碼可能會繼續工作而無需修改。

+0

從Iron Router> = 1.0開始,'this.request.query'已被棄用於'this.params.query' – mrkre 2015-07-09 03:36:27

+0

@ Geoffrey-Booth我一直試圖從GSM屏蔽發送數據,並且這行代碼有一個GET我只是將它切換爲POST,儘管是否需要'Meteor.call('POST''或Iron Router已經處理了這個?'char request [] =「GET /test-get-post.php ?a = 1&b = 2 HTTP/1.1 \ r \ n主機:test.libelium.com \ r \ n內容長度:0 \ r \ n \ r \ n「;' – mjwrazor 2016-04-01 16:50:38

2

使用IronRouter,它是如此簡單:

var path = IronLocation.path();