我在从 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
在被调用之前等待我的提取完成?
答案 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);
}
});