Node.js中创建H2数据库表失败,查询提示表不存在求助
问题分析与修复
你的代码里有几个关键问题导致表创建失败或者查询时机不对:
1. 异步操作未按顺序执行
h2.initialize是异步方法,但你直接调用test(),这时候数据库连接池可能还没初始化完成,后续的创建表、插入、查询操作都会因为连接问题失败。同时init、addSome、getAll都是异步操作,你直接依次调用会让它们并行执行,查询操作可能在表创建完成前就执行了,自然找不到表。
2. INSERT语句语法错误
你的插入SQL写法有误,多个值的正确格式是values(1),(2),(3),(4),(5),而不是多次写values()。
3. 错误处理缺失
代码里很多异步操作的错误没有捕获和输出,比如创建表失败、插入失败的错误信息都没打印,导致你看不到问题所在。
修复后的代码
var JDBC = require('jdbc'); var jinst = require('jdbc/lib/jinst'); var config = { url: 'jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=3;ACCESS_MODE_DATA=rw;DATABASE_TO_UPPER=false', drivername: 'org.h2.Driver', minpoolsize: 10, maxpoolsize: 100, }; if (!jinst.isJvmCreated()) { jinst.addOption("-Xrs"); jinst.setupClasspath(['./lib/h2-2.1.214.jar']); } var h2 = new JDBC(config); // 先等初始化完成再执行后续操作 h2.initialize((err) => { if (err) { console.log('initialize.error:', err); return; } console.log('h2 initialized:', h2); test(); // 初始化完成后再调用test }); function queryDB(sql, callback) { h2.reserve((err, connobj) => { if (err) { console.log('reserve connection error:', err); return callback?.(err); } if (!connobj || !connobj.conn) { console.log('error excuting query: no connection'); return callback?.(new Error('no connection available')); } connobj.conn.createStatement((err, statement) => { if (err) { console.log('create statement error:', err); h2.release(connobj); return callback?.(err); } if (callback) { statement.executeQuery(sql, (err, result) => { h2.release(connobj, (releaseErr) => { if (releaseErr) console.log('release connection error:', releaseErr); callback(err, result); }); }); } else { statement.executeUpdate(sql, (err) => { h2.release(connobj, (releaseErr) => { if (releaseErr) console.log('release connection error:', releaseErr); if (err) console.log('execute update error:', err); }); }); } }); }); }; // 给init、addSome加上回调,保证顺序执行 function init(callback) { queryDB("CREATE TABLE IDS_TABLE (ID_COL int)", callback); } function addSome(callback) { // 修正INSERT语法 queryDB("insert into IDS_TABLE(ID_COL) values(1),(2),(3),(4),(5)", callback); } function getAll(callback) { queryDB("SELECT ID_COL FROM IDS_TABLE", (err, result) => { if (err) { console.log('query error:', err); return callback?.(err); } console.log('result: ', result); callback?.(null, result); }); } function test() { // 用回调链保证顺序:先建表,再插入,最后查询 init((err) => { if (err) return; addSome((err) => { if (err) return; getAll(); }); }); }
关键修复点说明
- 把
test()放在h2.initialize的回调里,确保数据库连接池初始化完成后再执行操作。 - 给
init、addSome添加回调参数,通过回调链保证操作顺序:建表完成后再插入,插入完成后再查询。 - 修正INSERT语句的语法错误。
- 补充所有异步步骤的错误处理,方便排查问题。
- 在
queryDB里完善连接释放和错误回调,避免资源泄漏。
内容的提问来源于stack exchange,提问作者User User
相关产品推荐
相关产品推荐

