如何让 discord 等待脚本完成 运行 以及如何在获取所需数据之前不回复 discord?
How to make discord wait for the script to finish running and how to not reply to discord before getting the data needed?
我是 node.js 和异步编程的新手,所以我对为什么会这样感到有点困惑。我正在尝试 运行 一个 discord 机器人,它将给我来自第 3 方网站的数据。我能够从 3rd 方站点查询数据,并且可以在我的控制台中看到数据。但是数据无法显示在不和谐中。
const { SlashCommandBuilder } = require('@discordjs/builders');
const execFile = require('child_process').execFile;
const path = require('node:path');
const commandsPath = path.join(__dirname, '..', 'Folder_name');
let scriptPath = path.join(commandsPath, 'querydata.js');
let output = "";
module.exports = {
data: new SlashCommandBuilder()
.setName('cmdname')
.setDescription('blank'),
async execute(interaction) {
await runScript(scriptPath)
await interaction.reply(output)
},
};
function runScript(scriptPath) {
return new Promise((resolve, reject) => {
execFile('node', [scriptPath], (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout);
output = stdout
resolve(output)
});
});
}
我试过使用 Promise,async/await 但我会看到这个错误
RangeError [MESSAGE_CONTENT_TYPE]: Message content must be a non-empty string.
将我的代码更改为下面的代码我会得到这个错误,我可以在其中查询数据但是当我得到数据不一致时会终止调用,认为我的机器人没有响应。 (我测试的时候机器人在线)enter image description here
module.exports = {
data: new SlashCommandBuilder()
.setName('cmd')
.setDescription('blank'),
async execute(interaction) {
runScript(scriptPath)
.then(interaction.reply(output))
},
};
function runScript(scriptPath) {
return new Promise((resolve, reject) => {
execFile('node', [scriptPath], (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout);
output = stdout
resolve(output)
});
});
}
我不明白,我想如果我使用 await 那么脚本会等到 运行Script 函数完成后再回复 discord。但是脚本不断尝试将空输出字符串发送到 discord,这会导致 RangeError 错误。
另一方面,当我使用第二个代码块时,我在 Discord 中收到错误(图片中看到的错误)。
这应该适合你!
async execute(interaction) {
await runScript(scriptPath)
.then(output => interaction.reply(output))
}
它将 await
脚本,字面意思是等待它完成它的承诺,然后将从中获取输出并用它回复。
我是 node.js 和异步编程的新手,所以我对为什么会这样感到有点困惑。我正在尝试 运行 一个 discord 机器人,它将给我来自第 3 方网站的数据。我能够从 3rd 方站点查询数据,并且可以在我的控制台中看到数据。但是数据无法显示在不和谐中。
const { SlashCommandBuilder } = require('@discordjs/builders');
const execFile = require('child_process').execFile;
const path = require('node:path');
const commandsPath = path.join(__dirname, '..', 'Folder_name');
let scriptPath = path.join(commandsPath, 'querydata.js');
let output = "";
module.exports = {
data: new SlashCommandBuilder()
.setName('cmdname')
.setDescription('blank'),
async execute(interaction) {
await runScript(scriptPath)
await interaction.reply(output)
},
};
function runScript(scriptPath) {
return new Promise((resolve, reject) => {
execFile('node', [scriptPath], (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout);
output = stdout
resolve(output)
});
});
}
我试过使用 Promise,async/await 但我会看到这个错误
RangeError [MESSAGE_CONTENT_TYPE]: Message content must be a non-empty string.
将我的代码更改为下面的代码我会得到这个错误,我可以在其中查询数据但是当我得到数据不一致时会终止调用,认为我的机器人没有响应。 (我测试的时候机器人在线)enter image description here
module.exports = {
data: new SlashCommandBuilder()
.setName('cmd')
.setDescription('blank'),
async execute(interaction) {
runScript(scriptPath)
.then(interaction.reply(output))
},
};
function runScript(scriptPath) {
return new Promise((resolve, reject) => {
execFile('node', [scriptPath], (error, stdout, stderr) => {
if (error) {
console.error('stderr', stderr);
throw error;
}
console.log(stdout);
output = stdout
resolve(output)
});
});
}
我不明白,我想如果我使用 await 那么脚本会等到 运行Script 函数完成后再回复 discord。但是脚本不断尝试将空输出字符串发送到 discord,这会导致 RangeError 错误。 另一方面,当我使用第二个代码块时,我在 Discord 中收到错误(图片中看到的错误)。
这应该适合你!
async execute(interaction) {
await runScript(scriptPath)
.then(output => interaction.reply(output))
}
它将 await
脚本,字面意思是等待它完成它的承诺,然后将从中获取输出并用它回复。