2012-08-03 14 views
18

Sto pianificando di utilizzare Meteor per un'applicazione di registrazione in tempo reale per vari Il mio requisito è piuttosto semplice, passerò un messaggio di log come richiesta Parametro (POST O GET) da varie applicazioni e Meteor necessità di aggiornare semplicemente una raccolta. Ho bisogno di accedere ai parametri di richiesta nel codice del server Meteor e aggiornare la raccolta Mongo con il logMessage in entrata. Non riesco ad aggiornare Mongo Collection direttamente dalle applicazioni esistenti, quindi per favore nessuna risposta suggerisce lo stesso. Voglio sapere come posso farlo dal framework Meteor e non farlo aggiungendo altri pacchetti.Come accedere ai parametri della richiesta in Meteor?

+0

non sono sicuro se è possibile accedere all'istanza node.js sottostante. Ma se in qualche modo riesci a farcela, un veloce 'app.post ('/', funzione (richiesta, risposta) {});' farebbe il trucco. Solo un'idea, non ho davvero idea se sia possibile. –

risposta

0

Allo stato attuale, non vi è il supporto per il routing lato server o azioni specifiche sul lato server quando vengono colpiti gli URL. Quindi non è facile fare ciò che vuoi. Ecco alcuni suggerimenti.

  1. Probabilmente si può ottenere quello che vuoi prendendo in prestito le tecniche che vengono utilizzate dal pacchetto oauth2 sul ramo autenticazione: https://github.com/meteor/meteor/blob/auth/packages/accounts-oauth2-helper/oauth2_server.js#L100-109

    Tuttavia questo non è supportato in realtà così non sono certo che sia una buona idea.

  2. Le altre applicazioni potrebbero effettivamente aggiornare le raccolte utilizzando DDP. Questo è probabilmente più facile di quanto sembri.

  3. È possibile utilizzare un'applicazione intermedia che accetta richieste POST/GET e comunica con il server meteorologico utilizzando DDP. Questa è probabilmente la cosa tecnicamente più semplice da fare.

+0

In realtà, Meteor Router _segue_ gestisce gli instradamenti sul lato server in aggiunta ai più comuni client-side. Vedi i documenti nella sua pagina github: https://github.com/tmeasday/meteor-router –

+1

Haha, hai ragione, naturalmente, ma quando ho scritto questa risposta non avevo ancora aggiunto quella funzionalità al router;) –

9

ho trovato una soluzione per aggiungere un router all'applicazione Meteor per gestire le richieste personalizzate.

Utilizza il middleware del router di connessione fornito con la meteora. Nessuna dipendenza extra!

Inserire questo prima/fuori Meteor.startup sul server. (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

Questo dovrebbe essere documentato su docs.meteor.com (almeno fino a quando non sarà disponibile una soluzione più ufficiale :) @Geoff –

+0

aggiungere quanto segue se si desidera utilizzare la ricerca automatica e l'analisi del corpo: app.use (connect.query()) .use (connect.bodyParser()) –

+1

Nota: a partire da 0.6.0 questo non funzionerà, anche se guardate NPM.require ('...'); – emgee

12

EDIT: aggiornato per utilizzare Iron Router, il successore di Meteor Router.

Install Iron Router e definire un percorso sul lato server:

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

Così, per una richiesta come http://yoursite.com/foo?q=somequery&src=somesource, la variabile this.request.query nella funzione sopra sarebbe { q: 'somequery', src: 'somesource' } e, pertanto, è possibile richiedere i singoli parametri attraverso this.request.query.q e this.request.query.src e simili. Ho solo testato le richieste GET, ma il POST e altri tipi di richiesta dovrebbero funzionare in modo identico; questo funziona a partire da Meteor 0.7.0.1. Assicurati di inserire questo codice all'interno di un blocco Meteor.isServer o in un file nella cartella /server nel tuo progetto.

originale del messaggio:

Usa Meteorite installare Meteor Router e definire un percorso sul lato server:

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

Così, per una richiesta come http://yoursite.com/foo?q=somequery&src=somesource, la variabile this.request.query nella funzione sopra sarebbe { q: 'somequery', src: 'somesource' } e quindi è possibile richiedere i singoli parametri tramite this.request.query.q a nd this.request.query.src e simili. Ho solo testato le richieste GET, ma il POST e altri tipi di richiesta dovrebbero funzionare in modo identico; questo funziona a partire da Meteor 0.6.2.1. Assicurati di inserire questo codice all'interno di un blocco Meteor.isServer o in un file nella cartella /server nel tuo progetto.

so l'interrogante non vuole aggiungere pacchetti, ma penso che l'uso Meteorite installare Meteor Router mi sembra un modo più a prova di futuro per implementare questo rispetto ad accedere agli oggetti Meteor privi di documenti interni come __meteor_bootstrap__. Quando l'API del pacchetto è finalizzata in una versione futura di Meteor, il processo di installazione di Meteor Router diventerà più semplice (non è necessario per Meteorite), ma è improbabile che nient'altro possa cambiare e il codice probabilmente continuerà a funzionare senza richiedere modifiche.

+0

Come Iron Router> = 1.0, 'this.request.query' è stato deprecato per' this.params.query' – mrkre

+0

@ Geoffrey-Booth Ho cercato di inviare dati da uno scudo GSM e questa linea di codice ha un OTTENEREI PASSARE PER UN POST, anche se c'è bisogno di un 'Meteor.call (' POST '' o Iron Router è già in grado di gestire questo? 'Char request [] = "GET /test-get-post.php ? a = 1 & b = 2 HTTP/1.1 \ r \ nHost: test.libelium.com \ r \ nContenuto: 0 \ r \ n \ r \ n "; ' – mjwrazor

2

Usa IronRouter, è così facile:

var path = IronLocation.path(); 
Problemi correlati