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"
      }
    });
  },
};

这样就能的到正确的效果了。

该文章的评论已关闭