NodeJS 使用嵌套readFile函数discord.js返回未定义的函数

tjvv9vkg  于 2022-11-29  发布在  Node.js
关注(0)|答案(1)|浏览(111)

我写了一个函数,它应该根据用户的id从JSON文件中返回一个日期,但是我得到了undefined。当我把readFile函数放在messageCreate事件侦听器中时,它工作了。当代码放在函数中时,它就不工作了。
这是js

function GetDate(userid) {
  fs.readFile("users.json", "utf-8", (err, jsonString) => {
    if(err) {
      return err;
    } else {
      try {
        const obj = JSON.parse(jsonString);
        let date = "";
        for (i=0; i < obj.users.length; i++) {
          if(obj.users[i].id === userid){
            date = obj.users[i].date;
          }
        }
        return date;
      }
      catch {
        return "Error parsing JSON!" + err;
      }
    }
  })
}

下面是调用该函数的messageCreate事件侦听器。

client.on("messageCreate", message => {
  if(message.content === "test") {
    const date = GetDate(message.author.id);
    console.log(date);
  }
})

下面是JSON文件

{
  "users": [
    {
      "id": "1010101010",
      "date": 1671876850
    },
    {
      "id": "2020202020",
      "date": 1671451250
    }
  ]
}
ruyhziif

ruyhziif1#

GetDate中不返回任何内容,只在回调函数中返回。
如果要使用回调,则需要将回调函数传递给getDate,并在获得结果(或错误)后调用该函数。
看看下面的代码。我还简化了一点for循环。

const fs = require('fs');
// ...
function getDate(userid, callback) {
  fs.readFile('./src/users.json', 'utf-8', (err, jsonString) => {
    if (err) return callback(err);

    try {
      const obj = JSON.parse(jsonString);
      for (let user of obj.users) {
        if (user.id === userid) {
          return callback(null, user.date);
        }
      }
    } catch (err) {
      return callback('Error parsing JSON!' + err);
    }
  });
}

client.on('messageCreate', (message) => {
  if (message.content === 'test') {
    // date is only available inside the callback function
    getDate(message.author.id, (date) => {
      console.log(date);
    });
  }
});

你也可以使用promises,这会让你的代码更易读:

const { readFile } = require('fs/promises');
// ...
async function getDate(userid) {
  try {
    const data = await readFile('./src/users.json', 'utf-8');
    const obj = JSON.parse(data);
    for (let user of obj.users) {
      if (user.id === userid) {
        return user.date;
      }
    }
  } catch (err) {
    throw err;
  }
}

client.on('messageCreate', async (message) => {
  if (message.content === 'test') {
    const date = await getDate(message.author.id);
    console.log({ date });
  }
});

相关问题