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

Chrome/Chromium升级后出现Uncaught TypeError: insertData is not a function求助

问题:Chrome升级后触发Uncaught TypeError: insertData is not a function错误

问题背景

  • 错误发生在已正常运行的线上生产代码中
  • Chrome升级至119.0.6045.159后出现此问题,测试Chromium 121.0.6151.0版本同样存在该问题

示例代码

...
// RDatabase构造函数定义:
RDatabase()
{
    const SCHEMA = 'CREATE TABLE IF NOT EXISTS trajPnts(...);';
    ...
    const PRESTM = 'INSERT INTO trajPnts(x1,x2,x3,...) VALUES(?,?,?,...);';
    try
    {
        this.db = openDatabase(...);
        this.createSchema = function ()
        { 
            ...
        }
        this.insertData = function (traj)    // <--- 这里定义的insertData方法!!!
        {
            ...
        }
        this.createSchema();
    }
    catch(e)
    {
        ...
    }

}
...
// 创建数据库实例:
var dbr = new RDatabase();
// 注册处理函数记录传入数据:
Handler.RegisterTrajHandler(
    function(traj)
    {
        dbr.insertData(traj);
    }
);
...

报错信息

Uncaught TypeError: insertData is not a function

原因分析

问题根源在RDatabase的构造函数逻辑:insertData和createSchema方法是在try块内部赋值的。如果openDatabase或者后续的createSchema调用抛出异常,catch块会捕获错误,但此时this.insertData还没完成赋值(或者赋值流程被中断),导致最终创建的dbr实例上不存在insertData方法,后续调用就会触发类型错误。

Chrome新版本可能调整了Web SQL的行为(比如openDatabase的异常触发条件、存储权限规则),之前未触发的异常现在被触发,才导致这个隐藏问题暴露出来。

解决方案

方案1:将方法定义移到try块外部

确保不管数据库初始化是否成功,实例都会拥有方法定义:

RDatabase()
{
    const SCHEMA = 'CREATE TABLE IF NOT EXISTS trajPnts(...);';
    const PRESTM = 'INSERT INTO trajPnts(x1,x2,x3,...) VALUES(?,?,?,...);';
    
    // 把方法定义移到try块外,确保实例始终具备这些方法
    this.createSchema = function ()
    { 
        ...
    }
    this.insertData = function (traj)
    {
        ...
    }

    try
    {
        this.db = openDatabase(...);
        this.createSchema();
    }
    catch(e)
    {
        ...
        // 在这里处理数据库初始化失败的逻辑,比如记录错误日志、提示用户
    }
}

方案2:调用前做存在性检查

在调用insertData前先验证方法是否存在,避免直接调用报错:

Handler.RegisterTrajHandler(
    function(traj)
    {
        if (typeof dbr.insertData === 'function') {
            dbr.insertData(traj);
        } else {
            // 处理方法不存在的情况,比如记录错误日志
            console.error('insertData方法未初始化');
        }
    }
);

方案3:排查初始化异常原因

检查openDatabase或createSchema抛出异常的具体原因,比如新版本浏览器的Web SQL存储配额限制、权限变化等,针对性修复数据库初始化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:07:52