Как использовать момент в приложении nest js - PullRequest
0 голосов
/ 20 января 2020

Я хочу использовать момент js в приложении js, а также иметь возможность протестировать свои услуги. Поэтому я предоставил момент js, как показано ниже, в моем модуле

providers: [
    {
      provide: 'MomentWrapper',
      useFactory: async () => moment(),
      scope: Scope.REQUEST,
    },
  ],

и в моем сервисе

    constructor(
        @Inject('MomentWrapper') private momentWrapper: moment.Moment
    )

Тогда у меня есть такой метод

    private calculateNextRun(every: number, period: SchedulePeriod): string {
        const currentDate = this.momentWrapper.tz('America/Toronto');
        let nextDate = null;

        nextDate = currentDate.add(every, period);
        console.log(currentDate.format(), nextDate.format(), every, period, );

        return nextDate.toISOString();
    }

Этот метод будет вызываться в al oop и должен получить текущую дату, добавить к ней несколько дней / недель / .. и вернуть ее.

Проблема в том, что он сохраняет старое значение, поэтому каждый раз это входит в метод не начиная с текущей даты

вывод на консоль

2020-01-25T16:39:19-05:00 2020-01-25T16:39:19-05:00 6 d
2020-02-15T16:39:19-05:00 2020-02-15T16:39:19-05:00 3 w
2020-02-16T16:39:19-05:00 2020-02-16T16:39:19-05:00 1 d

Если вы видите первую дату, которая currentDate продолжает изменяться

Есть ли какие-либо способ преодолеть эту проблему, без создания новой службы, как эта

import * as moment from 'moment-timezone';
@Injectable()
export class MomentService {
    moment(): moment.Moment {
        return moment();
    }
}

1 Ответ

1 голос
/ 21 января 2020

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

providers: [
    {
      provide: 'MomentWrapper',
      useValue: moment
    },
  ],
...