【问题标题】:How to access json file data from js file如何从js文件访问json文件数据
【发布时间】:2021-07-06 23:03:48
【问题描述】:

我正在开发一个不和谐的机器人,我想在用户发送特定消息时从我的 dactylo.json 文件中发送一个随机句子。 但是,当尝试从此文件访问数据时,我收到一个“未定义”错误,就像它无法读取我的 json 文件一样。 我查看了许多以前的问题,但找不到对我有帮助的答案,即使它帮助了其他人。 我确定我错过了一些东西,但我似乎找不到什么......

这是我来自 dactylo.json 的代码:

{
    "sentences":[
        {
            "sentence": "Un dragon gradé dégrade un gradé dragon.",
            "top":"0",
            "player":"Personne"
        },
        {
            "sentence":"Le mur murant Paris rend Paris murmurant.",
            "top":"0",
            "player":"Personne"
        },
        {
            "sentence":"Le cricri de la crique crie son cri cru et critique car il craint que l'escroc ne le croque et ne le craque.",
            "top":"0",
            "player":"Personne"
        }
    ]
}

我的代码来自我尝试获取数据的 dactylo.js:

const fs = require('fs');

module.exports = {
    name: 'dactylo',
    description: 'Démarre une partie de dactylo',
    execute(message) {
        message.reply("Recopiez la phrase suivante le plus rapidement possible :")
        const data = fs.readFileSync('C:/Users/steph/Documents/Discord Bot/commands/fun/dactylo.json');

        const sentences = data.sentences;
        var sentence = sentences[Math.floor(Math.random() * sentences.length)];
        message.channel.send(sentence);
    },
};

如果有帮助,我会遇到错误:

TypeError: Cannot read property 'length' of undefined
    at Object.execute (C:\Users\steph\Documents\Discord Bot\commands\fun\dactylo.js:11:71)
    at Client.<anonymous> (C:\Users\steph\Documents\Discord Bot\main.js:42:11)
    at Client.emit (events.js:375:28)
    at MessageCreateAction.handle (C:\Users\steph\Documents\Discord Bot\node_modules\discord.js\src\client\actions\MessageCreate.js:31:14)
    at Object.module.exports [as MESSAGE_CREATE] (C:\Users\steph\Documents\Discord Bot\node_modules\discord.js\src\client\websocket\handlers\MESSAGE_CREATE.js:4:32)
    at WebSocketManager.handlePacket (C:\Users\steph\Documents\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketManager.js:384:31)
    at WebSocketShard.onPacket (C:\Users\steph\Documents\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:444:22)
    at WebSocketShard.onMessage (C:\Users\steph\Documents\Discord Bot\node_modules\discord.js\src\client\websocket\WebSocketShard.js:301:10)
    at WebSocket.onMessage (C:\Users\steph\Documents\Discord Bot\node_modules\ws\lib\event-target.js:132:16)
    at WebSocket.emit (events.js:375:28)

【问题讨论】:

标签: javascript node.js discord.js


【解决方案1】:

你可以简单地在开头导入json文件:

const dactylo = require('<path_to_json>.json');

【讨论】:

    【解决方案2】:

    您可以使用require为您自动解析JSON

    const data = require('path/to/file.json');
    

    另外,最好使用文件的相对路径而不是绝对路径。

    【讨论】:

      【解决方案3】:

      在您的情况下,fs.readFileSync 函数返回 Buffer,而不是您期望的解析的 json 内容。

      为了获取解析后的JSON内容,需要分两步:

      1. 将 .json 文件内容读取为文本
      2. 使用 JSON.parse 解析文本

      以下代码说明了它是如何工作的:

      const jsonPath = 'C:/Users/steph/Documents/Discord Bot/commands/fun/dactylo.json';
      const jsonText = fs.readFileSync(jsonPath, "utf8"); 
      const jsonObject = JSON.parse(jsonText);
      console.log(jsonObject.sentences.length);   // 3
      

      请注意,传递给fs.readFileSync 函数的第二个参数告诉该函数将文件内容作为字符串而不是缓冲区返回。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2014-09-05
        • 1970-01-01
        • 2020-10-30
        • 2021-06-27
        • 1970-01-01
        相关资源
        最近更新 更多