如何将functions文件夹内导出的函数改写为async异步函数
改造方法及完整代码
你只需要给导出的函数添加async关键字标记即可,和你在主逻辑或handler里写异步函数的规则完全一致,独立文件夹导出没有额外适配要求,改造后的代码如下:
const Discord = require('discord.js'); require('dotenv').config(); // 若要配合async/await做数据库操作,建议引入mysql2的promise版本 const mysql = require('mysql2/promise'); let connection; // 导出多个函数的写法,不要和下方单个导出的写法混用,二选一即可 module.exports = { // 函数前加async关键字,标记为异步函数 autoRoleCheck: async function (message, bot) { // message.member.id是同步属性,不需要加await let userId = message.member.id; let owner = message.guild.ownerID // fetch返回Promise,需加await获取实际返回的guild实例 let myGuild = await bot.guilds.fetch(process.env.BOT_GUILD); console.log(myGuild); // 后续数据库操作直接用await调用即可,示例: // const [userRoleRows] = await connection.execute('SELECT role_id FROM user_roles WHERE uid = ?', [userId]) } } /* 单个函数导出的写法 async function autoRoleCheck(message, bot) { let userId = message.member.id; let owner = message.guild.ownerID let myGuild = await bot.guilds.fetch(process.env.BOT_GUILD); console.log(myGuild); } module.exports = autoRoleCheck; */
注意事项
- 原有代码中的
bot实例在独立模块中无法直接获取,需要在调用函数时作为参数传入 - 调用异步导出函数时,必须搭配
await使用,同时建议加try/catch捕获异步异常,每小时定时执行的示例代码如下:
const { autoRoleCheck } = require('./functions/你的文件名.js'); // 每3600*1000毫秒=1小时执行一次 setInterval(async () => { try { // 传入需要的参数,若你是全局校验所有用户不需要message参数,可以自行修改函数逻辑去掉该参数,直接遍历bot内的guild成员即可 await autoRoleCheck(message, bot); } catch (err) { console.error('角色校验任务执行出错:', err); } }, 3600 * 1000);
- 不要重复赋值
module.exports,后续的赋值会直接覆盖之前的导出内容,按需选择多函数导出或单函数导出即可
内容的提问来源于stack exchange,提问作者CarrymesenpaiUwU
相关产品推荐
相关产品推荐

