cloudflare worker中new Date().getTime()返回0的解决办法
在cloudflare worker中编写JavaScript代码时,可能会需要获取时间,如果代码在全局
范围中,那么获取到的时间就会为0,例如以下代码:
const data = new Date().getTime();
export default {
async fetch(request, env, ctx) {
return new Response(data, {
headers: {
"Content-Type": "text/plain"
}
});
},
};
这样编写毫无疑问会得到0,按照Cloudflare Workers 架构师 Kenton Varda 的解释:“原因在于,Cloudflare Workers 在一个未指定的时间运行全局作用域。这可能是在请求到达时按需运行,但也可能会更早。从理论上讲,Workers 甚至可能只执行一次全局作用域,然后快照其状态,并在边缘执行时从快照开始。为了确保这种不同的实现选项不会影响已部署 Workers 的行为,Workers 运行时必须确保全局作用域的执行是完全确定性的。其中一个方面是,Date.now()
在全局作用域中执行时必须始终返回相同的值——0。”
参考文献:https://stackoverflow.com/questions/58491003/how-to-get-the-current-date-in-a-cloudflares-worker
因为我们只需要改动一下代码的位置,修改后的代码如下:
export default {
async fetch(request, env, ctx) {
const data = new Date().getTime();
return new Response(data, {
headers: {
"Content-Type": "text/plain"
}
});
},
};
这样就能的到正确的效果了。