在哪里放置async函数可使用await发送合并内容的单条Discord响应
问题根源
你当前的写法是在cells.map()遍历中每次都单独调用message.reply(),所以每一行数据都会触发一次消息发送,自然就会拆成多条消息。另外Google Sheets的API官方支持Promise写法,你可以结合async/await把异步逻辑写得更清晰,避免回调嵌套。
修正后代码
const { google } = require('googleapis'); const keys = require('../Data/client_secret.json'); const Command = require("../Structures/Command"); const gclient = new google.auth.JWT( keys.client_email, null, keys.private_key, ['https://www.googleapis.com/auth/spreadsheets'] ); module.exports = new Command({ name: "freeagents", description: "Potential free agents for next season.", async run(message, args, client) { try { // 授权改成await写法 await gclient.authorize(); console.log("Connected!"); await gsrun(gclient); } catch (err) { console.log(err); return message.reply("拉取数据失败,请稍后再试"); } async function gsrun(cl) { const gsapi = google.sheets({version:'v4', auth: cl }); // 把回调改成await获取API返回结果 const res = await gsapi.spreadsheets.values.get({ spreadsheetId: "11e5nFk50pDztDLngwTSmossJaNXNAGOaLqaGDEwrbQM", range: 'Keepers!C1:F', }); const rows = res.data.values; if (rows.length) { const cells = rows.filter(cell => cell[3]); // 先把所有行拼接成一个完整的字符串,换行分隔 const replyContent = cells.map(cell => `${cell[0]}, ${cell[1]}`).join('\n'); // 只调用一次reply发送所有内容 return message.reply(replyContent); } else { console.log('No data found.'); return message.reply('没有找到对应的自由球员数据'); } } } });
核心修改点
- 把原来的回调写法全部替换成async/await写法,避免回调嵌套,逻辑更清晰
- 不再在遍历中单独发送消息,而是先把所有需要返回的内容用
map+join拼接成一个完整的字符串,统一调用一次message.reply发送 - 增加了异常捕获,出错时也会给用户返回提示,不会没有响应
如果单条消息内容超过Discord的2000字符限制,可以把内容拆分后用分页或者嵌入(Embed)的形式发送,当前逻辑下内容少的场景直接拼接完全够用。
内容的提问来源于stack exchange,提问作者Nate S
相关产品推荐
相关产品推荐

