簡體   English   中英

Node.js JsonParser 自定義函數“無法讀取未定義的屬性”

[英]Node.js JsonParser custom function "cannot read property of undefined"

我正在嘗試制作一個 JSON 函數,該函數能夠從 JSON 文件中為多個其他函數返回解析后的數據,而無需一遍又一遍地重寫相同的代碼。 這是我擁有的函數以及一個變量:

var fs = require('fs');
function jsonParser(jsonFile) {
    fs.readFile(jsonFile,
        function (err, data) {
            var jsonData = data;
            var jsonParsed = JSON.parse(jsonData);
            return jsonParsed;
        })
};

當我在這個函數中插入一個console.log進行測試時,它從jsonParsed返回數據,沒有任何問題。 以下是此函數將被使用的方式+位置的一個示例:

msg.channel.send(jsonParser('package.json').version);

這是正在加載的 JSON 文件:

{
  "name": "discord-bot",
  "version": "0.4.0",
  "description": "Mírre from The Autorise Domain recreated as a Discord bot",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  }
}

我嘗試了多種方法來嘗試獲取“版本”數據,但它每次都返回相同的“無法讀取未定義的‘版本’的屬性”消息。 我希望能夠通過msg.channel.send()推送對象數據,但這並沒有發生——就好像程序在到達發送函數時已經將對象從內存中擦除了一樣。

任何幫助將不勝感激!

編輯:該函數在Discord.Client()消息函數中被調用。 將 bot 定義為const bot = new Discord.Client() ,使用jsonParser的命令從一個大的bot.on('message'...函數中調用。從這里開始,有多個的 switch-case某人可以給機器人的命令,其中之一用於查找機器人的版本;這是調用jsonParser地方。

正如我所評論的,更改為fs.promises沒有問題:

const fs = require('fs');
const path = require('path');

async function jsonParser(jsonFile) {
  const data = await fs.promises.readFile(path.resolve(__dirname, jsonFile));

  var jsonData = data.toString('utf-8');
  var jsonParsed = JSON.parse(jsonData);
  return jsonParsed;
};

(async function (jsonFile) {
  const data = await jsonParser(jsonFile);
  console.log(data.version);
})('./test.json').catch(e => {
  console.log(e);
});

由於此代碼用於 Discord 機器人,因此請確保客戶端的.on函數使用async()如下所示:

const bot = new Discord.Client();
...
bot.on('message', async(msg) => {...}

如果在執行期間 JSON 中的任何內容都沒有發生變化(在 package.json 的情況下不應該發生變化),您可以繼續使用 require。

const { version } = require('./package.json');

...

msg.channel.send(version);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM