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

向MariaDB插入数据时出现undefined变量错误的问题咨询

问题原因

  • 异步执行顺序混乱:两次pool.getConnection()调用是并行触发的,没有先后依赖,插入数据的请求大概率会先于建表请求执行,就算解决字段报错也可能出现表不存在的错误。
  • SQL拼接方式错误:直接把JS变量嵌入SQL模板字符串的写法不符合mariadb驱动的使用规范:Date类型直接转字符串不是SQL可识别的datetime格式,且没有加单引号包裹,数据库会把解析失败的内容识别为列名,触发未知列报错;同时这种写法存在SQL注入风险。
  • 你可以使用驱动自带的参数化查询能力,将变量作为query方法的第二个参数传入,驱动会自动完成类型转换和特殊字符转义,不需要手动拼接变量到SQL语句中。

修正后代码

// 注意原有代码如果缺失mariadb引入语句,需要补上,否则也会引发报错
const mariadb = require('mariadb');

const obj = {
    time: new Date(),
    taken: 0,
    given: 6.4
}

const pool = mariadb.createPool({
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'P1data'
})

async function run() {
    let conn;
    try {
        conn = await pool.getConnection();
        // 先建表
        const createSql = `create table if not exists live(
            time datetime primary key,
            taken float not null,
            given float not null
        )`;
        await conn.query(createSql);
        // 再用参数化方式插入数据
        const insertRes = await conn.query(
            'INSERT INTO live(time, taken, given) VALUES (?, ?, ?)',
            [obj.time, obj.taken, obj.given]
        );
        console.log('插入成功', insertRes);
    } catch (err) {
        console.error('操作失败', err);
    } finally {
        if (conn) conn.end();
        await pool.end();
    }
}

run();

如果还有问题可以检查数据库账号权限、P1data库是否已经提前创建,以及本地mariadb服务是否正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 20:24:03