Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js JsonParser自定义函数";无法读取未定义的属性";_Javascript_Node.js_Json_Parsing_Discord.js - Fatal编程技术网

Javascript Node.js JsonParser自定义函数";无法读取未定义的属性";

Javascript Node.js JsonParser自定义函数";无法读取未定义的属性";,javascript,node.js,json,parsing,discord.js,Javascript,Node.js,Json,Parsing,Discord.js,我正在尝试创建一个JSON函数,该函数能够从JSON文件返回多个其他函数的解析数据,而无需反复重写相同的代码。这是我的函数,还有一个变量: var fs=require('fs'); 函数jsonParser(jsonFile){ fs.readFile(jsonFile, 功能(错误、数据){ var jsonData=数据; var jsonParsed=JSON.parse(jsonData); 返回jsonParsed; }) }; 当我将console.log插入此函数进行测试时,它

我正在尝试创建一个JSON函数,该函数能够从JSON文件返回多个其他函数的解析数据,而无需反复重写相同的代码。这是我的函数,还有一个变量:

var fs=require('fs');
函数jsonParser(jsonFile){
fs.readFile(jsonFile,
功能(错误、数据){
var jsonData=数据;
var jsonParsed=JSON.parse(jsonData);
返回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"
  }
}
我尝试了多种方法来获取“version”数据,但每次都返回相同的“cannotreadproperty of'version'ofundefined”消息。我希望能够通过
msg.channel.send()
推送对象数据,但这并没有发生——就好像程序在到达send函数时已经将对象从内存中清除一样

任何帮助都将不胜感激

编辑
正在
Discord.Client()消息函数中调用该函数。将bot定义为
const bot=new Discord.Client()
后,将从大型
bot.on调用
jsonParser
中使用的命令('message'…
函数。在这里,有一个切换案例,有人可以向bot发送多个命令,其中一个命令用于查找bot的版本;这就是调用
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 bot,请确保客户端的
.on
函数使用的是
async()
,如下所示:

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

如果在执行过程中JSON中没有任何内容发生变化(在package.JSON中不应该发生变化),您可以继续使用require

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

...

msg.channel.send(version);

实际上,您并不是从函数返回json。您是从readFile的回调返回json,但不是从父函数返回json,因此在从父函数返回之前,您将一直处于未定义状态。因为您使用回调读取文件,所以应改为使用承诺:
fs.promises.readFile(jsonFile)
msg.channel.send((等待jsonParser('package.json')).version)
@HoangDao这似乎走在正确的轨道上,但并不完全正确。现在我被告知消息行中jsonParser的
SyntaxError:Unexpected identifier
。这个错误似乎很奇怪,你遗漏了什么吗?@Freerey啊,你的json文件末尾遗漏了
}
,我想可能有某种差异在同步/异步函数之间。当我放置
异步函数(jsonFile)时
括号中的一部分,我没有返回任何数据,调试器也没有显示任何错误,但是简单地将这些代码行放入其中而不包装在异步函数中会导致错误
wait仅在异步函数中出现。为了更好地理解这是在哪种函数中工作,我将更新q继续添加一些代码。您缺少函数的
async
声明,如果您使用的是discord,它应该类似于
bot.on('message',async()=>{});
非常感谢您的帮助!我对答案进行了一些编辑,以澄清这在discord bot上是如何工作的,现在它工作得很好。:)