Rez*_*eza 5 javascript node.js momentjs typescript nestjs
我想在 Nestjs 应用程序中使用 momentjs,并且还能够测试我的服务。所以我在我的模块中提供了 momentjs,如下所示
providers: [
{
provide: 'MomentWrapper',
useFactory: async () => moment(),
scope: Scope.REQUEST,
},
],
Run Code Online (Sandbox Code Playgroud)
为我服务
constructor(
@Inject('MomentWrapper') private momentWrapper: moment.Moment
)
Run Code Online (Sandbox Code Playgroud)
然后我有一个这样的方法
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();
}
Run Code Online (Sandbox Code Playgroud)
该方法将在循环中调用,并应该获取当前日期并向其添加一些天/周/.. 并返回它。
问题是它保留旧值,因此每次进入该方法时都不是从当前日期开始
控制台输出
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
Run Code Online (Sandbox Code Playgroud)
如果您看到第一个日期,该日期currentDate不断变化
有没有办法解决这个问题,而不需要创建这样的新服务
import * as moment from 'moment-timezone';
@Injectable()
export class MomentService {
moment(): moment.Moment {
return moment();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
这对我来说效果很好:
// in some *.service.ts
import * as moment form 'moment';
{ userIsRegistredOn: moment()}
Run Code Online (Sandbox Code Playgroud)
您应该为每个函数调用创建一个新的 moment 实例,而不是重复使用提供者单例的同一实例。因此,请提供moment而不是moment():
providers: [
{
provide: 'MomentWrapper',
useValue: moment
},
],
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18679 次 |
| 最近记录: |