2012-08-03 39 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();