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

Nest.js/Vue中使用requestAnimationFrame报未定义错误求助

解决requestAnimationFrame未定义的问题

问题原因

requestAnimationFrame是浏览器专属的API,Node.js(服务器端)环境里没有这个全局函数。你现在的报错说明调用了requestAnimationFrame的代码跑到服务器端执行了——结合你用socket.io做多人游戏的场景,大概率是把客户端的渲染逻辑(比如moveBall函数)不小心写到了服务器代码里,或是服务器端的socket事件处理里触发了moveBall。

修复步骤

  1. 拆分客户端与服务器端代码
    游戏的渲染逻辑(Canvas绘制、moveBall函数、requestAnimationFrame调用)必须放在浏览器端的JS文件里,服务器端只负责处理socket通信:比如接收客户端的位置数据、转发给其他玩家、同步游戏状态。

举个示例:

  • 服务器端代码只做事件转发:
socket.on("gameFunctions", data => {
  // 将事件广播给所有玩家
  io.emit("clientGameFunctions", data);
});
  • 客户端监听广播事件后执行渲染逻辑:
socket.on("clientGameFunctions", data => {
  switch(data) {
    case "resetBall":
      ballPosition.y = 250;
      ballPosition.x = 250;
      SocketIo.emit("rectPosition", rectPosition, ballPosition);
      console.log("RESET BALL EVENT TRIGGERED");
      break;
    case "startGame":
      moveBall(); // 此处在浏览器端执行,存在requestAnimationFrame
      SocketIo.emit("rectPosition", rectPosition, ballPosition);
      console.log("START GAME EVENT TRIGGERED");
      break;
  }
});
  1. 兼容旧浏览器(可选)
    如果是在旧版浏览器中报错,可以在客户端代码最前面加个兼容垫片:
if (!window.requestAnimationFrame) {
  window.requestAnimationFrame = window.webkitRequestAnimationFrame ||
                                 window.mozRequestAnimationFrame ||
                                 function(callback) {
                                   return setTimeout(callback, 1000/60);
                                 };
}
  1. 排查代码执行路径
    确保moveBall函数只会被客户端代码调用,服务器端永远不要执行它——服务器不需要渲染Canvas,只负责同步数据即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:24:12