【发布时间】: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