UnhandledPromiseRejectionWarning:DiscordAPIError:无法发送空消息

时间:2021-01-31 21:44:44

标签: javascript node.js discord.js es6-promise

我在从 fetch 向 Discord 频道发送消息时遇到问题。

我正在从 REST API 获取时间序列数据。然后,如果 Discord 用户键入命令,我想发送此数据。

代码:

require("dotenv").config();
const fetch = require("node-fetch");
const { Client } = require("discord.js");
const PREFIX = "!";

const getPrice = async (ticker) => {
    let result = "test";
    const request = await fetch(
      `https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=${ticker}&interval=5min&apikey=${process.env.API_KEY}`
    );
    const response = await request.json();
    const data = await response;
    const obj = await data["Time Series (5min)"];
    result = obj[Object.keys(obj)[0]];
    return result;
};

client.on("message", (message) => {
    if (message.author.bot) return;
    if (message.content.startsWith(PREFIX)) {
      const [command, ...args] = message.content
        .trim()
        .substring(PREFIX.length)
        .split(/\s+/);
      const result = getPrice(`${command.toUpperCase()}`);
      message.channel.send(result);
    }
});

我收到以下错误:

UnhandledPromiseRejectionWarning: DiscordAPIError: Cannot send an empty message

如果您查看以下代码并将其替换为 console.log - 它可以工作。例如

原创

message.channel.send(result);

替换为

console.log(result)

然后就可以了:

{
  '1. open': '119.0200',
  '2. high': '119.0200',
  '3. low': '119.0200',
  '4. close': '119.0200',
  '5. volume': '302'
}

我怀疑这与 Promises 有关系,也许我的理解还不够完善,但我已经一遍又一遍地阅读文档并且无法理解它。

我认为 result 为空的原因是因为在堆栈中调用该方法时,fetch 尚未返回数据,而是尝试发送空数据。

如何确保 message.channel.send 在被调用之前等待我的提取完成?

1 个答案:

答案 0 :(得分:1)

getPrice 是一个返回承诺的异步函数。您需要等待结果才能发送:

client.on("message", async (message) => {
    if (message.author.bot) return;
    if (message.content.startsWith(PREFIX)) {
      const [command, ...args] = message.content
        .trim()
        .substring(PREFIX.length)
        .split(/\s+/);
      const result = await getPrice(`${command.toUpperCase()}`);
      message.channel.send(result);
    }
});