Сравните даты в Mongoose Doc и экспресс текущей даты - PullRequest
2 голосов
/ 19 апреля 2019

Я нахожу пользователя, отправляющего запрос POST, а затем выясняю, есть ли у него документ в той же схеме, которую он пытается отправить. Если их несколько, я сортирую и возвращаю самый последний. Я хотел бы сравнить текущую дату с датой, найденной в документе mongoose, чтобы выяснить, выполнили ли они то же действие за последние 30 дней, и если да, помешать им выполнить указанное действие.

Перепробовал несколько решений для поиска в Google / stackoverflow / reddit, но не получил желаемого.

Внутри моего POST-запроса в Express

let currentDate = new Date();
    console.log(currentDate);
    User.findOne({
            user: req.user.id
        })
        .then(user => {
            Scores.find().sort({date: -1}).limit(1)
             .select('date')
             .then(date => {
                 if (currentDate - date <= 30) {
                     res.json({toosoon: 'You are attempting to do this action too many times in one month'})
                 })
             })
        })

Запретить пользователю возможность отправлять запрос на публикацию, если у него есть документ в моей коллекции, дата которого меньше или равна 30 дням с момента последнего представления.

1 Ответ

1 голос
/ 19 апреля 2019

Это простая манипуляция с датой JS, которую вы можете использовать в своем коде.

let date = new Date();

console.log('Today is: ' + date.toLocaleString());

date.setDate(date.getDate() - 30);

console.log('30 days ago was: ' + date.toLocaleString());

Однако я настоятельно рекомендую использовать moment.js library
Здесь у вас есть полное объяснение того, как его использовать, вкл.примеры:

Начало работы с Moment.js:

Moment.js свободно доступно для скачиванияс домашней страницы проекта .Moment.js можно запустить как из браузера, так и из приложения Node.js.Чтобы использовать его с Node, установите модуль с помощью следующей команды:

npm install moment Затем просто require () и используйте его в своем приложении, как показано ниже.

const moment = require('moment');

moment().format();

Чтобы запустить Moment из браузера, загрузите сценарий и включите его, используя тег script, как показано в следующем примере.Moment.js создает объект глобального момента, который можно использовать для доступа ко всем функциям анализа и манипуляции с датой и временем.

*** Форматирование даты ****


ВВ прошлом я вспоминал преобразование строк даты в объекты Date, захват отдельных фрагментов данных, а затем выполнение конкатенации строк.Moment.js упростила процесс преобразования даты в любой конкретный формат.Преобразование формата даты с помощью Moment выполняется просто, как показано в следующем примере.

moment().format('YYYY MM DD');

moment() отображает текущую дату и время, а format() преобразует текущую дату и время в указанный формат.В этом примере форматируется дата в виде четырехзначного года, за которым следует пробел, за которым следует двухзначный месяц, еще один пробел и двухзначная дата.Вы можете увидеть этот код в действии, ознакомившись с этой демонстрацией.

Проверка даты


Еще одна досадная задача, которую имеет Moment.jsупрощена проверка даты.Чтобы выполнить проверку, просто передайте строку даты объекту момента вместе с форматом даты и вызовите метод isValid ().Этот метод возвращает true, если дата действительна, и false в противном случае.Пример этого показан ниже вместе с сопровождающей демонстрацией.

let dateEntered = $('#txtEnteredDate').val();

if (!moment(dateEntered,'MM-DD-YYYY').isValid()) {
  console.log('Invalid Date');
} else {
  console.log('Valid Date');
}

В объекте есть ряд других полезных флагов, возвращаемых moment():

переполнение - устанавливается при переполнении.Примером может служить 13-й месяц или 32-й день.

*invalidMonth* – Set when the month is invalid, like Jannnuaarry.
*empty* – Set when the entered date contains nothing parsable.
*nullInput* – Set when the entered date is null.

Манипуляции с датами


Существует несколько вариантовманипулирование моментом объекта.Например, вы можете добавлять или вычитать дни, месяцы, годы и т. Д. Это достигается с помощью методов add() и subtract().В следующем примере показано, как к текущей дате добавляются семь дней, месяцев или недель.

moment().add('days', 7);    // adds 7 days to current date
moment().add('months', 7);  // adds 7 months to current date
moment().add('years', 7);   // adds 7 years to current date

Аналогично, метод subtract() показан ниже.

moment().subtract('days', 7);   // subtracts 7 days to current date
moment().subtract('months', 7); // subtracts 7 months to current date
moment().subtract('years', 7);  // subtracts 7 years to current date

Время отсрочки


Другая распространенная задача - определить, сколько времени существует между двумя датами.Для расчета времени по текущей дате Moment.js использует метод с именем fromNow().Вот пример, который проверяет, сколько времени существует с текущего времени:

moment().fromNow();

Этот пример кода отображает «несколько секунд назад». Если мы передадим дату объекту момента, он отобразит диапазон времени отсейчас по разнице.Например, следующий код отображает «7 дней назад».

const dateA = moment().subtract('days', 7);

dateA.fromNow();

Время с другой даты fromNow () используется для сравнения времени с текущей датой,Это просто особый случай from(), который сравнивает две произвольные даты.Пример, который использует from () показан ниже.Этот код отображается «через день». Вы можете увидеть этот код в действии, ознакомившись с этой демонстрацией.

const dateB = moment('2019-12-12');
const dateC = moment('2019-12-11');
console.log(dateB.from(dateC));

Расчет разницы между датами


Moment.jsпредлагает способ рассчитать разницу между двумя датами. Разница вычисляется в миллисекундах по умолчанию , но также может быть возвращена в днях, месяцах, годах и т. Д. Чтобы вычислить разницу, вызовите метод diff (). Этот метод принимает дату в качестве первого аргумента. Единицу времени можно указать с помощью необязательного второго аргумента. Если это не включено, то используются миллисекунды. В следующем примере и демонстрации показано, как используется diff().

const dateB = moment('2019-11-11');
const dateC = moment('2019-10-11');

console.log («Разница есть», dateB.diff (dateC), «миллисекунды»); console.log («Разница есть», dateB.diff (dateC, «days»), «days»); console.log («Разница есть», dateB.diff (dateC, «месяцы»), «месяцы»);

Дата запросов

Moment.js также предоставляет методы сравнения дат. Эти методы isBefore(), isAfter() и isSame(). Как следует из имен, эти методы возвращают логическое значение, указывающее, является ли одна дата до, после или равна другой дате. Пример, использующий isAfter (), показан ниже.

console.log(moment('2010-09-20').isAfter('2010-10-19')); // returns false
console.log(moment('2010-11-20').isAfter('2010-10-19')); // returns true

Существует также метод isLeapYear(), который проверяет високосные годы. Я также предлагаю взглянуть на метод calendar(), особенно для вашего случая;)

...