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

Node.js开发倒计时出现count未定义及timer函数外未定义报错求解

问题原因

1. count is not defined报错

你将count作为命名函数表达式传入setInterval,这类函数的名称仅在函数自身内部作用域可访问,外层作用域无法直接调用count(),因此触发未定义报错。

2. 外部访问timer为undefined

setInterval是异步宏任务,注册后不会立刻执行回调函数,会优先执行后续的console.log(timer)、response.send逻辑,此时回调还未运行,timer没有被赋值,自然返回undefined。且即使后续回调执行更新了timer,接口响应已经提前返回,也无法把最新值传给前端。
另外你代码中countDown、distance、days等变量均未声明,会污染全局作用域,也存在隐式风险。

修复方案

如果你的需求是首次计算完所有订单倒计时后直接返回结果,可以参考以下修改后的代码:

const getOrder = async(request, response) => {
  const data = await knex("orderbook_table").select()
  const time_data = await knex("orderbook_table").select("timestamp")

  console.log(time_data)

  // 把count函数提到外层定义,支持全局调用
  function count() {
    // 用数组存储所有订单的倒计时,避免只保留最后一个
    const timerList = []
    const second = 1000,
          minute = second * 60,
          hour = minute * 60,
          day = hour * 24;
    for (var i = 0; i < time_data.length; i++) {
      const entryDate = time_data[i].timestamp;
      const countDown = new Date(entryDate).getTime();
      const now = new Date().getTime();
      const distance = countDown - now;

      const days = Math.floor(distance / (day));
      const hours = Math.floor((distance % (day)) / (hour));
      const minutes = Math.floor((distance % (hour)) / (minute));
      const seconds = Math.floor((distance % (minute)) / second);

      const timer = days + "d:" + hours + "h:" + minutes + "m:" + seconds + "s";
      timerList.push(timer)
    }
    return timerList
  }

  // 同步调用count获取计算结果
  const timerList = count();
  console.log(timerList);

  // 把倒计时结果一起返回给前端
  response.send({ orderStr: data, timerList });

  // 如果需要后端定时更新倒计时,建议单独起定时任务,配合WebSocket推送给前端,不要写在接口逻辑里
  // setInterval(count, 1000)
}

如果需要实现前端实时刷新倒计时,更合理的方案是把时间戳返回给前端,由前端自己启动定时器计算更新,无需后端参与定时逻辑,减少服务端压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:09:02