如何将有关从渠道获取的消息的信息放入JSON文件?

时间:2019-08-04 18:12:30

标签: javascript node.js json discord.js

因此,我想从特定渠道获取所有嵌入的消息,并在其说明中写上一个标签。

我首先使用channel.fetchMesssages()提取嵌入式消息和简单消息并兑现了承诺。我得到了集合,可以将消息的值一对一地打印到控制台,但是不能将它们添加到对象中然后再将它们另存为JSON文件。

代码如下:

var news = client.channels.get('id')
var specialMessages = new Object()

news.fetchMessages()
    .then(messages => {
        messages.forEach((m, i) => {
            specialMessages[m.content] = m.id
        })
    })

console.log(specialMessages)
fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2))

问题是我似乎没有向specialMessages添加任何内容,因为它仅向控制台输出{}。背后的魔力是什么?

4 个答案:

答案 0 :(得分:4)

console.log()是在提取消息之前执行的,因为后者是异步操作并且没有立即完成(有关Promises 的信息)。< / p>

您应将console.log(...)fs.writeFileSync(...)行放在forEach()循环之后,但应放在.then()块的scope内。

答案 1 :(得分:0)

这应该有效

(async () => {
  const news = client.channels.get('id');
  const specialMessages = {};

  const messages = await news.fetchMessages();
  messages.forEach((m, i) => {
     specialMessages[m.content] = m.id;
  });
  console.log(specialMessages);
  fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2));
})();

答案 2 :(得分:0)

您的specialMessages是{},原因是文件未完成。文件完成后尝试console.log或使用异步回调。

var news = client.channels.get('id')
var specialMessages = new Object()

news.fetchMessages()
    .then(messages => {
        messages.forEach((m, i) => {
            specialMessages[m.content] = m.id
        })
    })

fs.writeFileSync('messages.json', JSON.stringify(specialMessages, null, 2))
console.log(specialMessages)

答案 3 :(得分:-1)

使用.map()

var news = client.channels.get('id');

news.fetchMessages()
    .then(messages => {
        fs.writeFileSync('messages.json', JSON.stringify(messages.map(m => m.id), null, 2));
    });