You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Deno Deploy部署出现RangeError:performance.timeOrigin未定义求助

Deno Deploy中performance.timeOrigin未定义导致Date.toISOString()报错的解决办法

问题

代码部署到Deno Deploy平台时,日志抛出错误:

ERROR: RangeError: Invalid time value at Date.toISOString ()

排查发现是代码里const start = performance.timeOrigin;这一行返回了undefined,导致new Date(start + now)传入了无效值(undefined + 数字 = NaN),触发了toISOString()的报错。测试用Date.now()替代performance.timeOrigin后问题解决,且performance.now()可正常运行。

原因

Deno Deploy的无服务器运行时未实现performance.timeOrigin属性——该属性在浏览器环境中返回页面加载的起始时间戳,但在Deno Deploy中没有对应的初始化逻辑,因此返回undefined。

修复方案

performance.now()返回的是当前进程启动到现在的毫秒数,我们可以用Date.now() - performance.now()模拟performance.timeOrigin的效果(即进程启动时的时间戳),既保留原代码逻辑,又兼容Deno Deploy环境。也可以直接用Date.now()简化逻辑,跳过进程启动时间的计算。

修复后的完整代码

/**
 * @param {number} [precision=6] - 指定返回的秒数小数位数
 * @returns {string} - 带微秒精度的ISO 8601时间戳
 */

const Timestamp = function (precision = 6) {
  // 确保精度参数为整数
  if (!Number.isInteger(precision)) precision = 6;
  const p = precision;

  // 兼容多环境:优先使用原生performance.timeOrigin,否则用模拟值
  const start = typeof performance.timeOrigin !== 'undefined' 
    ? performance.timeOrigin 
    : Date.now() - performance.now();
  const now = performance.now();
  
  // 计算当前时间戳并生成基础ISO字符串
  const currentTime = start + now;
  const iso = new Date(currentTime).toISOString();
  
  // 提取并格式化微秒部分
  const microseconds = ((currentTime % 1000) / 1000).toFixed(p).slice(2);

  // 拼接成带微秒的最终ISO时间戳
  return iso.substring(0, iso.indexOf('.') + 1) + microseconds + 'Z';
};

export default Timestamp;

补充说明

  • 增加了环境判断逻辑,兼容支持performance.timeOrigin的其他运行环境
  • 用标准Number.isInteger替换了原代码中的type.int,避免自定义依赖问题
  • 核心逻辑保持和原代码一致,仅修复了Deno Deploy环境下的时间值无效问题

内容的提问来源于stack exchange,提问作者Ruslan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:52:35