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

Next.js next/script组件onError事件如何获取真实错误对象

解决Next.js next/script组件onError回调返回Event而非Error的问题

next/script的onError本质是绑定了原生script标签的error事件,这个事件的回调参数本身就是Event对象,官方文档的类型标注可能做了简化,导致实际拿到的和文档描述不符。以下是几种获取真实错误信息的方法:

  • 从Event对象提取内置Error属性
    部分浏览器会在Event对象上挂载error属性,直接指向真实的Error实例,可以这样获取:

    import Script from 'next/script'
    
    export default function Page() {
      const handleError = (event) => {
        const realError = event.error || new Error(`脚本加载失败: ${event.target.src}`);
        console.log(realError.message);
      }
    
      return (
        <Script
          src="https://js.recurly.com/v4/recurly.js"
          onError={handleError}
        />
      )
    }
    
  • 用try/catch捕获库初始化错误
    如果需要初始化第三方库,把初始化逻辑放在onLoad回调里,用try/catch包裹,能捕获加载完成后的执行错误:

    import Script from 'next/script'
    
    export default function Page() {
      const handleLoad = () => {
        try {
          const recurly = window.recurly;
          recurly.configure({ publicKey: '你的公钥' });
        } catch (error) {
          console.log('初始化错误:', error.message);
        }
      }
    
      const handleError = (event) => {
        const loadError = new Error(`加载失败: ${event.target.src}`);
        console.log(loadError.message);
      }
    
      return (
        <Script
          src="https://js.recurly.com/v4/recurly.js"
          onLoad={handleLoad}
          onError={handleError}
        />
      )
    }
    
  • 手动创建script标签(绕过next/script封装)
    要是上面的方法都不满足,可以手动创建script标签,自定义错误处理逻辑,灵活性更高:

    import { useEffect } from 'react'
    
    export default function Page() {
      useEffect(() => {
        const script = document.createElement('script');
        script.src = 'https://js.recurly.com/v4/recurly.js';
        script.async = true;
    
        script.onerror = (event) => {
          const error = new Error(`脚本加载失败: ${event.target.src}`);
          console.log(error.message);
        };
    
        script.onload = () => {
          try {
            const recurly = window.recurly;
            recurly.configure({ publicKey: '你的公钥' });
          } catch (error) {
            console.log('初始化错误:', error.message);
          }
        };
    
        document.body.appendChild(script);
    
        return () => document.body.removeChild(script);
      }, []);
    
      return <div>页面内容</div>
    }
    

注意:不同浏览器对script错误事件的实现有差异,有些不会直接暴露Error对象,这时候只能基于事件里的脚本URL等信息构建自定义Error;而库的初始化错误必须通过try/catch捕获,因为这属于脚本加载完成后的执行阶段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:02:36