向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
相关产品推荐
相关产品推荐

