如何在NodeJS上更改进程日期而不是直接更改系统日期?

时间:2018-04-17 15:15:11

标签: javascript node.js date process environment-variables

我想在使用Date类时进行一些需要更改进程日期的测试:

console.log(Date.now())

正常运行我的程序,该过程将获得机器当前时间:

"scripts": {
   "start": "node testDate.js"
}

是否有类似交叉环境的东西可以改变初始流程日期?

"scripts": {
   "start": "cross-env CURRENT_DATE=<future-date> node testDate.js"
}

或者在运行时是否有解决方案?

NodeJS可以更改过程日期吗?

process.DATE_CLOCK=Date("<future-date>")

console.log(Date.now())// will print the future date + time passed after  previous line has been executed

1 个答案:

答案 0 :(得分:1)

我认为这是不可能通过现有的节点环境变量实现的,但您应该 签出 mockdate 包。

这是一个在单元测试中使用的例子。

// mut.js
module.exports = {
    getCurrentDate: () => Date.now()
}


// mut.test.js
const mut = require('./mut');
const mockdate = require('mockdate');

describe('mut', () => {
    const mockedTime = 1609865118363;

    it('should return adjusted date', () => {
        mockdate.set(mockedTime);
        expect(mut.getCurrentDate())
            .toEqual(mockedTime);
    });

    it('should return current date/time', () => {
        mockdate.reset();
        expect(mut.getCurrentDate())
            .not.toEqual(mockedTime);
    });
});

如果您坚持通过节点环境添加它,您可以添加一个类似于 Sengupta Amit 注释的进程环境检查并包装您的应用程序入口点。这会将时间设置为类似于您在上面要求的方式。

//testDate.js
// CURRENT_DATE=1609865118363 node ./testDate.js

const mockdate = require('mockdate');
const mut = require('./mut');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));

console.log(mut.getCurrentDate()); // will log 1609865118363 to console

编辑: 还使用 Express 和 Node Http Server 对此进行了测试。它仍然有效,并将返回带有通过 mockdate 设置的时间的 Date 标头。

// CURRENT_DATE=1609865118363 node testDate.js
const app = require('express')();
const mockdate = require('mockdate');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));

app.get('/', (req, res) => res.send());

app.listen(3000, (err) => {
    if(err) console.log(err);
})

enter image description here

const mockdate = require('mockdate');
const currentDate = process.env.CURRENT_DATE;
if (currentDate) mockdate.set(parseInt(currentDate));

const http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200);
  res.end();
}).listen(8080);

enter image description here