JSON 读取函数返回未定义而不是预期值 - Typescript

问题描述 投票:0回答:2

我正在开发一个函数,用于根据过去的内容读取 JSON 文件并返回值。在实际函数中,我可以完全按照我的预期输出到控制台,但是当我将其返回然后输出到控制台时,我得到了未定义的结果。

我正在使用的 JSON 文件如下所示:

{
    "ECMadrid": "tbd",
    "ECParis": "tbd2"
}

我用来读取文件的函数如下所示:

    getReferenceNumber(productName){
        fs.readFile('./filepath.json', 'utf-8', (err, jsonString) => {
            if (err) {
                console.log(err)
            } else {
                try {
                    const data = JSON.parse(jsonString);
                    console.log("The reference number before returning is: ", data[productName]);
                    return data[productName];
                } catch (err) {
                    console.log("Error parsing JSON:", err);
                }
            }
        });
    } 

我在测试文件中调用该函数,如下所示:

let referenceNumber = await jsonHelper.getReferenceNumber("ECMadrid");
await console.log("I got sent: ", referenceNumber);

我希望这两个控制台日志输出相同的结果,但我的输出是这样的(值得注意的是,它首先输出函数调用之后的控制台日志,我认为这很奇怪并且值得指出):

我收到了:未定义
返回前的参考编号是:tbd

我试图弄清楚为什么 getReferenceNumber 函数正确地将我想要的内容分配给 data[productName] ,但将 undefined 返回到我实际调用它的类。预先感谢您的任何反馈

json typescript
2个回答
1
投票

getReferenceNumber
不是
async
,并且不返回承诺。唯一的
return
语句位于嵌套函数中,该函数从该函数返回,而 not 来自
getReferenceNumber
。这意味着
getReferenceNumber
不返回任何值,这就是为什么你得到“未定义”。

您可能想要

fsPromises.readFile

我相信这是等价的。

async getReferenceNumber(productName: string) {
  try {
    const jsonString = await fs.promises.readFile('./filepath.json', 'utf-8')

    try {
      const data = JSON.parse(jsonString);
      console.log("The reference number before returning is: ", data[productName]);
      return data[productName];
    }
    catch (err) {
      console.log("Error parsing JSON:", err);
    }
  } catch (err) {
    console.log(err);
  }
}

1
投票

您可以将

readFile
替换为
readFileSync
以使用同步调用(如果您同意它是阻塞代码)。
然后,您可以删除测试文件中的
await

© www.soinside.com 2019 - 2024. All rights reserved.