TypeScript中JSON读取函数返回Undefined而非预期值问题排查
问题分析与解决方案
问题根源
你的getReferenceNumber函数返回undefined,核心原因是异步回调的返回值无法传递到外层函数,且函数未返回Promise导致await失效:
fs.readFile是异步IO操作,回调函数会在文件读取完成后才执行。你在回调里写的return data[productName],只是回调函数的返回值,和外层getReferenceNumber函数无关——外层函数调用fs.readFile后会立即执行完毕,默认返回undefined。- 你调用时用了
await,但getReferenceNumber没有返回Promise,所以await不会等待异步操作完成,直接拿到undefined,这也是调用处日志先输出的原因。
修复方案
推荐两种符合异步编程规范的修复方式:
方案1:将回调包装为Promise
修改函数让它返回Promise,在异步操作完成后传递结果:
getReferenceNumber(productName) { return new Promise((resolve, reject) => { fs.readFile('./filepath.json', 'utf-8', (err, jsonString) => { if (err) { console.log(err); reject(err); } else { try { const data = JSON.parse(jsonString); const refNumber = data[productName]; console.log("The reference number before returning is: ", refNumber); resolve(refNumber); } catch (err) { console.log("Error parsing JSON:", err); reject(err); } } }); }); }
方案2:使用fs.promises(推荐)
Node.js的fs模块提供了Promise化API,配合async/await写法更简洁:
async getReferenceNumber(productName) { try { const jsonString = await fs.promises.readFile('./filepath.json', 'utf-8'); const data = JSON.parse(jsonString); const refNumber = data[productName]; console.log("The reference number before returning is: ", refNumber); return refNumber; } catch (err) { console.log("Error reading or parsing JSON:", err); throw err; } }
调用说明
两种方案的调用方式可保持原有写法,但需确保调用代码处于async函数中:
let referenceNumber = await jsonHelper.getReferenceNumber("ECMadrid"); console.log("I got sent: ", referenceNumber); // console.log是同步操作,无需添加await
修改后,调用处会等待异步操作完成,拿到正确返回值,日志顺序也符合预期。
内容的提问来源于stack exchange,提问作者Derek
相关产品推荐
相关产品推荐

