【问题标题】:How to use moment in nestjs application如何在nestjs应用程序中使用时刻
【发布时间】:2020-05-05 22:59:27
【问题描述】:

我想在一个 Nestjs 应用程序中使用 momentjs,并且还能够测试我的服务。 所以我在我的模块中提供了momentjs,如下所示

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

这个方法将被循环调用,并且应该获取当前日期并添加一些天/周/..并返回它。

问题是它保留了旧值,因此每次进入方法时都不是从当前日期开始

控制台输出

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

【问题讨论】:

  • 将提供者定义为useValue: moment,然后调用this.momentWrapper().tz(...,是否有效?
  • @KimKern 我把它改成了你问的,无论如何我得到 this.momentWrapper() 的语法错误,但是如果我在你的更改中使用我的旧语法,似乎它正在工作
  • @KimKern 请将其发布为接受的答案

标签: javascript node.js typescript momentjs nestjs


【解决方案1】:

您应该为每个函数调用创建一个新的时刻实例,而不是重复使用您的提供者单例的相同实例。所以提供moment而不是moment()

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

【讨论】:

    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 2016-12-05
    • 2021-04-07
    • 2020-06-18
    • 2019-09-22
    • 1970-01-01
    • 2018-05-21
    • 2021-06-30
    相关资源
    最近更新 更多