2013-05-23 19 views
5

Tworzę prostą małą sieć społecznościową. Mam zrobione wszystkie wpisy, użytkownicy itd. Jedyną wadą jest to, że jest to tylko czat. Gdy publikujesz coś na czyjejś stronie, jedynymi osobami, które mogą go wyświetlać, są osoby na stronie w danym momencie. Po odświeżeniu wszystkie posty zniknęły. Oto techniczna część tego, co robię, gdy wysyłane są posty i co chcę zrobić.Mangusta znaleźć ostatnie dziesięć wpisów w bazie danych

Ilekroć publikujesz post, robi coś, co nie jest ważne, nie będę ich wymieniał. Ale jest jedna część, która jest ważna, wysyłając ją na serwer NodeJS. Oto kod wykorzystuje:

function sendPost(cont) { 
    socket.emit("newPost", username, uid, cont, page); 
    model.posts.unshift(new Post(username, uid, cont, page)); // You don't need to worry about this 
} 

Jak widać, to emituje „newPost” z nazwą użytkownika, identyfikatorze treści i strony. Na serwerze otrzymuje posty z tym, a następnie wstawia do bazy danych.

socket.on("newPost", function (name, id, cont, page) { 
    var thePost = new Post({name: name, cont: cont, id: id, page: page}); 
    console.log("Received a new post by "+thePost.name+"(ID of "+thePost.id+"), with the content of \""+thePost.cont+"\", on the page "+thePost.page); 
    socket.broadcast.emit("Post", name, id, cont, page); 
    console.log("Post sent!"); 
    console.log("Putting post in database..."); 
    thePost.save(function (err, thePost) { 
     if (err) { 
      console.log("Error inserting into database: "+err); 
     } else { 
      console.log("Put into database finished!"); 
     } 
    }); 
}); 

Teraz za mój rzeczywisty problem/pytanie. Za każdym razem, gdy strona ładuje się, wysyła żądanie do serwera w ten sposób:

socket.emit("getPrevious", curPage, amount); 

To działa dobrze. Na serwerze otrzymuje to i wykonuje następujące czynności:

socket.on("getPrevious", function(curPage, amount) { 
    console.log("Someone requested a page update, sending it to them..."); 
    Post.find({'page': curPage}).sort('-date').execFind(function(err, post){ 
     console.log("Emitting Update..."); 
     socket.emit("Update", post.name, post.id, post.cont);  
     console.log("Update Emmited"); 
    }); 
}); 

Ten kod znajdzie tylko jeden z najnowszych postów na tej stronie. Chcę, aby znalazł ostatnie posty, a potem je odesłał. Nawet to dzieje się tylko raz, kiedy przejść do strony, wyświetli to:

null says 

moje dwa pytania są to: Jak chciałbym zrobić to znaleźć najnowsze stanowisk, a dlaczego, tylko ten jeden , czy zwraca "null"?

Dzięki temu zaliczki. Jeśli potrzebujesz jakiegoś kodu, powiedz mi. Jeśli coś jest niejasne, powiedz mi.

Odpowiedz

8

W wywołaniu zwrotnym parametr post to tablica wpisów, a nie tylko jedna. Właśnie dlatego dostajesz null says, kiedy próbujesz traktować to jako pojedynczy wpis.

Ponadto, jeśli chcesz tylko najnowszą 10, możesz zadzwonić pod numer limit(10) w łańcuchu zapytań. Prawdopodobnie powinieneś także użyć exec zamiast execFind, ponieważ jest nieco jaśniejszy.

Więc coś takiego:

Post.find({'page': curPage}).sort('-date').limit(10).exec(function(err, posts){ 
    console.log("Emitting Update..."); 
    socket.emit("Update", posts.length);  
    console.log("Update Emmited"); 
}); 
+0

dzięki, dodam, że teraz! – Beaurocks16

+0

OK, jeszcze jeden problem. Robię to, wszystkie aktualizacje są wysyłane, wszystko jest w porządku, z tym wyjątkiem, że nie wydaje się sortowaniem. .sort ("- date") i .sort ("date") lub no .sort w ogóle daje takie same wyniki. Czy możesz rzucić trochę światła na to? – Beaurocks16

+0

Czy masz pojęcie, dlaczego ten rodzaj nie zadziała? – Beaurocks16

Powiązane problemy