2013-10-29 13 views
5

il seguente codice:come convertire array in cursori in pubblicazione?

Meteor.push("svse",function(){ 
    if(UserUtils.isAdmin(this.userId)) //is Administrator? 
     return Svse.find(); 
    var arr = ["1","1.2"]; //just a example 
    var nodes = Svse.find({sid:{$in:arr}}).fetch(); 
    var newNodes = new Array(); 
    for(i in nodes){ 
     var newNode = nodes[i]; 
     newNode["son"] = ArrayUtils.intersect(arr,newNode["son"]); 
     newNodes.push(newNode) 
    } 
    return newNodes; 
}); 

ArrayUtils={}; 
Object.defineProperty(ArrayUtils,"intersect",{ 
value : function(a,b){ 
    var ai=0; 
    var bi=0; 
    var result = new Array(); 
    while(ai < a.length && bi < b.length){ 
     if(a[ai] < b[bi]) { 
      ai++; 
     } else if(a[ai] > b[bi]){ 
      bi++; 
     } else { 
      result.push(a[ai]); 
      ai++; 
      bi++; 
     } 
    } 
    return result; 
} 
}); 

a meteore risultati di avvio in errori:

 Exception from sub ac338EvWTi2tpLa7H Error: 
     Publish function returned an array of non-Cursors

come convertire array cursori? o gestire array come ArrayUtils.intersect() nella query di ricerca operare here?

risposta

6

Pensa che Meteor.push sia un errore nella prima riga di codice.

Una funzione di pubblicazione deve restituire un cursore Collection o una serie di cursori Collection. Da docs:

Pubblica funzioni possono restituire un Collection.Cursor, nel qual caso Meteor pubblicherà documenti di cursore per ogni cliente sottoscritto. Puoi anche restituire una serie di Collection.Cursors, nel qual caso Meteor pubblicherà tutti i cursori.

Se si desidera pubblicare ciò che è in newNodes e non si desidera utilizzare una raccolta sul lato server, utilizzare this.added all'interno di pubblicazione. Per esempio:

Meteor.publish("svse",function(){ 
    var self = this; 
    if(UserUtils.isAdmin(self.userId)) //is Administrator? 
    return Svse.find(); // this would usually be done as a separate publish function 

    var arr = ["1","1.2"]; //just a example 
    Svse.find({sid:{$in:arr}}).forEach(function(newNode){ 
    newNode["son"] = ArrayUtils.intersect(arr,newNode["son"]); //is this just repeating query criteria in the find? 
    self.added("Svse", newNode._id, newNode); //Svse is the name of collection the data will be sent to on client 
    }); 
    self.ready(); 
}); 

E 'un po' difficile per me seguire ciò che vi aspettate che accada sia con il ritrovamento e funzioni che popolano newNode intersecano. Potresti essere in grado di fare lo stesso usando solo find con una limitazione di fields restituita.

+0

Grazie per il vostro tempo! Ora anche il mio codice può funzionare! Grazie!! –

+0

Interessante, ho provato ad usare il metodo aggiunto per pubblicare un array di stringhe, ma invece di avere la stringa "predrag" sul client, ottengo un oggetto di caratteri: Object {0: "p", 1: " r ", 2:" e ", 3:" d ", 4:" r ", 5:" a ", 6:" g ", _id: 0.39238154771737754} Qualche idea, perché? –

Problemi correlati