2012-08-03 8 views
18

Ich plane, Meteor für eine Echtzeit-Logging-Anwendung für verschiedene verwenden Meine Anforderung ist ziemlich einfach, ich werde eine Protokollmeldung als Anfrage übergeben Parameter (POST oder GET) aus verschiedenen Anwendungen und Meteor einfach eine Sammlung aktualisieren. Ich muss Request Parameter in Meteor Server-Code zugreifen und Mongo-Sammlung mit dem eingehenden logMessage aktualisieren. Ich kann Mongo Collection nicht direkt aus vorhandenen Anwendungen aktualisieren, daher bitte keine Antworten, die dasselbe vorschlagen.Ich möchte wissen, wie ich es vom Meteor-Framework aus tun kann und nicht, indem ich weitere Pakete hinzufüge.Wie greife ich auf Anforderungsparameter in Meteor zu?

+0

Ich bin nicht sicher, ob es möglich ist, die zugrunde liegende node.js Instanz zugreifen. Aber wenn Sie es irgendwie erreichen können, würde ein kurzer 'app.post ('/', Funktion (request, response) {});' den Trick machen. Nur eine Idee, ich habe wirklich keine Ahnung, ob das möglich ist. –

Antwort

0

Derzeit gibt es keine Unterstützung für serverseitiges Routing oder bestimmte Aktionen auf der Serverseite, wenn URLs betroffen sind. Es ist also nicht einfach, das zu tun, was du willst. Hier sind ein paar Vorschläge.

  1. Sie können sich wahrscheinlich erreichen, was Sie durch Kreditaufnahme Techniken wollen, die von der oauth2 Paket auf dem Auth-Zweig verwendet werden: https://github.com/meteor/meteor/blob/auth/packages/accounts-oauth2-helper/oauth2_server.js#L100-109

    Dies ist jedoch so nicht wirklich unterstützt ich nicht sicher bin ist es gut Idee.

  2. Ihre anderen Anwendungen konnten die Sammlungen tatsächlich mit DDP aktualisieren. Das ist wahrscheinlich einfacher als es klingt.

  3. Sie können eine Zwischenanwendung verwenden, die POST/GET-Anfragen akzeptiert und mit Ihrem Meteorserver über DDP kommuniziert. Dies ist wahrscheinlich die technisch einfachste Sache zu tun.

+0

Tatsächlich behandelt Meteor Router _does_ serverseitige Routen zusätzlich zu den üblicheren Client-Seiten. Sehen Sie sich die Dokumentation auf der GitHub-Seite an: https://github.com/tmeasday/meteo-router –

+1

Haha, Sie haben natürlich Recht, aber als ich diese Antwort schrieb, hatte ich diese Funktionalität noch nicht zum Router hinzugefügt;) –

9

fand ich eine Abhilfe zu zum Meteor Anwendung einen Router hinzufügen, individuelle Anforderungen zu verarbeiten.

Es verwendet die Verbindung Router Middleware, die mit Meteor geliefert wird. Keine zusätzlichen Abhängigkeiten!

Setzen Sie diese vor/außerhalb Meteor.startup auf dem Server. (Coffee)

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

Dies sollte dokumentiert werden auf docs.meteor.com (zumindest bis eine offiziellere Lösung herauskommt) @Geoff –

+0

fügen Sie Folgendes hinzu, wenn Sie automatische Abfrage und Body-Parsing verwenden möchten: app.use (connect.query()) .use (connect.bodyParser()) –

+1

Hinweis: ab 0.6.0 funktioniert das nicht - obwohl NPM.require ('...'); – emgee

12

EDIT: Aktualisiert Iron Router zu verwenden, der Nachfolger von Meteor Router.

Install Iron Router und eine serverseitige Route definieren:

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

Also für eine Anfrage wie http://yoursite.com/foo?q=somequery&src=somesource, die Variable this.request.query in der obigen Funktion wäre { q: 'somequery', src: 'somesource' } und daher können Sie einzelne Parameter anfordern über this.request.query.q und this.request.query.src und dergleichen. Ich habe nur GET-Anfragen getestet, aber POST und andere Anfragetypen sollten identisch funktionieren; Dies funktioniert ab Meteor 0.7.0.1. Stellen Sie sicher, dass Sie diesen Code in einen Meteor.isServer Block oder in eine Datei im Ordner in Ihrem Projekt einfügen.

Original-Beitrag:

Verwenden MeteoriteMeteor Router zu installieren und eine serverseitige Route definieren:

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

Also für eine Anfrage wie http://yoursite.com/foo?q=somequery&src=somesource, die Variable this.request.query in der Funktion oben wäre { q: 'somequery', src: 'somesource' } und deshalb können Sie einzelne Parameter über this.request.query.q anfordern nd this.request.query.src und dergleichen. Ich habe nur GET-Anfragen getestet, aber POST und andere Anfragetypen sollten identisch funktionieren; Dies funktioniert ab Meteor 0.6.2.1. Stellen Sie sicher, dass Sie diesen Code in einen Meteor.isServer Block oder in eine Datei im Ordner in Ihrem Projekt einfügen.

Ich weiß, dass die Fragesteller nicht Pakete hinzufügen wollen, aber ich denke, dass Meteorite mit mir zu installieren Meteor Router eine zukunftssichere Art und Weise scheint dies für den Zugriff auf interne undokumentierte Meteor Objekte wie __meteor_bootstrap__ im Vergleich zu implementieren. Wenn die Paket-API in einer zukünftigen Version von Meteor finalisiert wird, wird die Installation von Meteor Router einfacher (keine Notwendigkeit für Meteorite), aber nichts anderes wird sich wahrscheinlich ändern und Ihr Code würde wahrscheinlich weiter funktionieren, ohne dass Änderungen erforderlich sind.

+0

Ab Eisen Router> = 1.0, 'this.request.query' ist veraltet für' this.params.query' – mrkre

+0

@ Geoffrey-Booth Ich habe versucht, Daten von einem GSM-Schild zu senden und diese Zeile des Codes hat eine GET Ich würde es nur für einen POST wechseln, obwohl es eine Notwendigkeit für eine 'Meteor.call (' POST '' oder ist Iron Router schon damit umgehen? 'Char Anfrage [] = "GET /test-get-post.php ? a = 1 & b = 2 HTTP/1.1 \ r \ nHost: test.libelium.com \ r \ nContent-Length: 0 \ r \ n \ r \ n "; ' – mjwrazor

2

Verwenden IronRouter, es ist so einfach:

var path = IronLocation.path(); 
Verwandte Themen