Хобрук: Ваш путь к мастерству в программировании

Mongoose находит последние десять записей в базе данных

Я делаю простую маленькую социальную сеть. У меня есть все вводные сообщения, пользователи и т.д. Единственное, что сейчас не так, это то, что это просто чат. Всякий раз, когда вы публикуете что-либо на чьей-либо странице, единственные люди, которые могут просматривать это, — это люди, находящиеся на странице в данный момент. При обновлении все сообщения исчезают. Вот техническая часть того, что я делаю, когда отправляются сообщения, и что я хочу сделать.

Всякий раз, когда вы публикуете пост, он делает что-то неважное, я не буду их перечислять. Но есть одна важная часть — отправка на сервер NodeJS. Вот код, который он использует:

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
}

Как видите, он создает «newPost» с именем пользователя, uid, содержимым и страницей. На сервере он получает сообщения с этим, а затем вставляет в базу данных.

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!");
        }
    });
});

Теперь о моей актуальной проблеме/вопросе. Всякий раз, когда страница загружается, она отправляет запрос на сервер следующим образом:

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

Это работает все отлично. На сервере он получает это и делает следующее:

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");
    });
});

Этот код найдет только одно из последних сообщений на этой странице. Я хочу, чтобы он нашел последние сообщения, а затем отправил их обратно. Даже если это происходит только один раз, когда я захожу на страницу, она отображает это:

null says

У меня два вопроса: как мне заставить его находить последние сообщения и почему, только с этим, он возвращает «ноль»?

Спасибо заранее. Если вам нужен какой-либо код, скажите мне. Если что-то непонятно, скажите.


Ответы:


1

В обратном вызове execFind параметр post представляет собой массив постов, а не один. Вот почему вы получаете null says, когда пытаетесь рассматривать это как отдельный пост.

Кроме того, если вам нужны только самые последние 10, вы можете вызвать limit(10) в своей цепочке запросов. Вероятно, вам также следует использовать exec вместо execFind, так как это немного понятнее.

Итак, что-то вроде:

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");
});
24.05.2013
  • Спасибо, сейчас добавлю! 25.05.2013
  • Хорошо, еще одна проблема. Делаю так, все обновления отправляются, все нормально, только не сортируется. .sort('-date') и .sort('date') или вообще без .sort дают одинаковые результаты. Можете ли вы пролить свет на это? 25.05.2013
  • @ Beaurocks16 Beaurocks16 У вас есть поле date, определенное в вашей схеме и в документах Post, которое содержит дату каждого документа, по которому вы хотите отсортировать? 28.05.2013
  • @ Beaurocks16 Тогда сортировка по нему не сработает. :) Вам нужно либо добавить и заполнить это поле, либо вместо этого отсортировать по _id, если его приближенное время создания соответствует вашим целям. 28.05.2013
  • Это помогло мне! Тай! 25.05.2019
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..