2013-07-01 10 views
5

Sto facendo un semplice inserimento in una raccolta di meteore che sembra funzionare, ma lascia vuota la raccolta.L'inserimento di Meteora nella raccolta sembra funzionare, ma rimane vuoto

La collezione è definito correttamente sul server:

Meteor.publish("comments", function() { 
return Comments.find(); 
}); 

Sottoscritto a correttamente nelle Client.js:

Meteor.subscribe("commments"); 

e impostare correttamente sulle model.js:

Comments = new Meteor.Collection("comments"); 

Il codice di inserimento è il seguente:

Meteor.methods({ 
    addComment: function (options) { 
    check(options.post_id, String); 
    check(options.comment, NonEmptyString); 

    if (! this.userId) 
     throw new Meteor.Error(403, "You must be logged in to comment."); 
    if (options.comment.length > 1000) 
     throw new Meteor.Error(413, "Comment is too long"); 
    var post = Posts.findOne(options.post_id); 
    if (! post) 
     throw new Meteor.Error(404, "No such post"); 
// add new comment 
    var timestamp = (new Date()).getTime(); 
    console.log('Comment: ' + options.comment); 
    console.log('Post: ' + options.post_id); 
    console.log('UserId: ' + this.userId); 
    var saved = Comments.insert({ 
     owner: this.userId, 
     post_id: options.post_id, 
     timestamp: timestamp, 
     text: options.comment}); 
    console.log('Saved: ' + saved); 
    } 
}); 

Una volta che l'inserto è chiamato, le stampe console il seguente:

Comment: Something 
Post: xRjqaBBEMa6qjGnDm 
UserId: SCz9e6zrpcQrKXYWX 
Saved: FCxww9GsrDsjFQAGF 
> Comments.find().count() 
0 

ho inserti in diverse altre collezioni che funzionano bene (Messaggi essere uno di loro, come si può vedere l'ID Share il codice). Nel docs ist ha detto che se l'inserto errori fuori stamperà sulla console, ma come puoi vedere sembra funzionare, ma in realtà è vuoto.

Grazie.

AGGIORNAMENTO: ho trovato che i dati vengono inseriti nel database, ma per qualche motivo non vengono visualizzati. Non sono sicuro del motivo per cui i dati non vengono pubblicati correttamente poiché non ci sono filtri sul find().

risposta

5

Non so esattamente cosa c'è che non va, ma ci sono alcune cose da controllare qui.

• In primo luogo, questo:

Meteor.publish("comments", function() { 
    return Comments.find(); 
}); 

indirizza il server di pubblicare la collezione, ma in realtà non stabilire il lato server di raccolta.

È necessario disporre di Comments = new Meteor.Collection("comments"); disponibile sul client e sul server. Tendo a inserire un file chiamato model.js come lo è il examples.

• Seconda possibilità, non si dispone di una funzione di sottoscrizione mostrata sopra, ad esempio Meteor.subscribe("comments"); Se non si dispone di una funzione di sottoscrizione, il client non lo saprà, anche se esiste nella collezione.

È possibile testare questa teoria digitando meteor mongo nella shell (con l'app Meteor in esecuzione) e db.comments.find() per verificare se i propri commenti sono effettivamente nel database ma non sottoscritti.

+0

Ho controllato il mio codice e ho dimenticato di notare che ho l'abbonamento Meteor nel mio model.js. Ho i commenti = new Meteor.Collection ("commenti"); nella pagina principale, ma ho anche lo stesso per le collezioni Post e Sezione e funzionano come previsto. Ho controllato e sono nel database. Qualche altra idea del perché potrebbero non mostrare? – Erick

+0

'Meteor.subscribe (...)' dovrebbe essere nel tuo codice cliente, non condiviso ... Forse aggiornare il codice nella tua domanda? Dovrebbe essere molto facile localizzare il bug se potessi vedere dove si trova :) – emgee

+0

Il mio errore (ho ancora bisogno del mio caffè del mattino). Meteor.subscribe() è sul client, non sul modello. Commenti = new Meteor.Collection ("commenti"); è nel file model.js. – Erick

0

Verificare di non avere un errore nel codice cliente. Con Meteor.call, se non si inizializza una variabile, è possibile che si verifichi una condizione di errore che bloccherà l'aggiornamento reattivo nei modelli, ma continuerà a scrivere correttamente sulla console appena prima della mano.

ho fatto questo errore, che parlo qui: http://doctormehmet.blogspot.com/2013/07/revoltdc-hackathon-20130622-iteration-3.html

In particolare ho avuto qualcosa di simile

Template.mytemplate.helpers({ 
    somevar: function({ 
       if (some_session_var_set_by_a_call.party){ 
       //do something 
       } 
} 

Ora la funzione somevar viene chiamato il rendering, prima che i rendimenti Meteor.call. Pertanto la variabile some_session_var_set_by_a_call non è ancora impostata. L'intera faccenda ferma il lato client sull'errore indefinito.

+0

Come puoi vedere, controllo gli errori e registro tutte le variabili prima di inserirle. Niente errori nella console. C'è qualcos'altro che posso fare per controllare? Inoltre, ho controllato il db direttamente per suggerimento @emgee e sto mostrando che i commenti sono stati pubblicati. Ora sembra che il problema sia che il codice cliente non sta accedendo correttamente alla raccolta. Idee? – Erick

+0

Erick Non riesco a vederlo, perché non riesco a vedere la tua funzione Meteor.call, le funzioni di rendering, le funzioni di supporto o il modello che servi al client. Dato che non ci sono errori, perché non provare una stampa (console.log) all'interno di un callback all'interno della funzione Meteor.call e vedere cosa succede. È inoltre necessario collegare una sorta di elemento reattivo (un session.get o un cursore) nel modello per aggiornarlo quando la funzione asincrona ritorna in un momento successivo. La funzione asincrona deve modificare quella variabile reattiva per creare la dipendenza. – DrM

+0

Grazie per l'input. Ho sbagliato a scrivere "commenti" come "commmenti". – Erick

Problemi correlati