使用jshs2操作Hive 1.1.0时await/async报错:预期FINISHED却为RUNNING
我完全懂这种“旧工具刚好踩中需求痛点”的处境——虽然jshs2已经过时,但它能完美适配你的使用场景,没必要为了“现代化”硬换工具。既然npm run test:msg能正常运行,说明你的配置本身是没问题的:
{ "auth": "NOSASL", "host": "127.0.0.1", "port": 10000, "timeout": 10000, "username": "hive", "password": "hive", "hiveType": 1, "hiveVer": "0.13.1", "cdhVer": "5.3.0", "thriftVer": "0.9.2", "maxRows": 5120, "nullStr": "NULL", "i64ToString": true }
但你提到基于async/await的现代写法没法正常工作,目前只贴了const { Configuration, ...这样的代码开头,信息还不够全。要精准排查问题,麻烦你补充几个关键细节:
- 完整的async函数代码:比如你是如何调用jshs2的核心API的?有没有把原本的回调式方法封装成Promise后用await调用?
- 具体的异常表现:是抛出了明确的错误信息?还是代码卡在await处一直无响应?有没有错误栈可以提供?
- 你已经尝试过的调试动作:比如有没有用
try/catch包裹await代码块?有没有试过把async/await换成手动Promise包装的写法测试?
另外,我可以先给你几个常见的排查方向,你可以先自查:
回调转Promise的正确性
jshs2的API大概率是基于回调的,如果你自己封装Promise,一定要同时处理成功和错误分支,否则会导致await要么一直pending,要么吞掉错误:// 错误示范:忽略错误回调 const runQuery = (config) => { return new Promise(resolve => { jshs2.executeQuery(config, (err, data) => { resolve(data); // 没处理err,错误会被吞掉,await可能永远等不到结果 }); }); }; // 正确示范:同时处理resolve和reject const runQuery = (config) => { return new Promise((resolve, reject) => { jshs2.executeQuery(config, (err, data) => { if (err) reject(err); else resolve(data); }); }); };确保await在async函数内使用
await关键字只能在被async标记的函数内部使用,如果在普通函数里直接写await,会直接抛出语法错误,这点一定要确认。异步流程中的配置传递
检查在async函数中,配置对象有没有被意外修改,或者有没有某些初始化步骤(比如建立连接)是异步的,但你没等待它完成就直接执行查询了?
等你补充完信息,我可以帮你更精准地定位问题。
内容的提问来源于stack exchange,提问作者HP.

