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

TypeScript中JSON读取函数返回Undefined而非预期值问题排查

问题分析与解决方案

问题根源

你的getReferenceNumber函数返回undefined,核心原因是异步回调的返回值无法传递到外层函数,且函数未返回Promise导致await失效:

  1. fs.readFile是异步IO操作,回调函数会在文件读取完成后才执行。你在回调里写的return data[productName],只是回调函数的返回值,和外层getReferenceNumber函数无关——外层函数调用fs.readFile后会立即执行完毕,默认返回undefined。
  2. 你调用时用了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 05:12:18