无法按指定时间戳删除消息,使用moment.js筛选7天前消息功能失效
问题根因
- 条件判断逻辑错误:
if (time)只是判断moment实例是否存在,只要代码不报错这个条件永远为真,相当于没有任何时间过滤,所以所有拉取到的消息都会触发删除逻辑 - 时间比对逻辑完全错误:给消息创建时间减7天的操作没有任何意义,正确逻辑应该是先算出「7天前的时间点」,再比对消息创建时间是否早于这个时间点
- bulkDelete用法错误:不需要在遍历消息的循环里反复调用批量删除,应该先过滤出所有符合删除条件的消息集合,再统一调用批量删除接口
- async/await和Promise.then写法混用,逻辑冗余且容易出问题
修正后可运行代码
// 计算7天前的UTC时间戳 const sevenDaysAgo = moment.utc().subtract(7, 'days').valueOf(); // 拉取最多100条频道消息 const messages = await channel.messages.fetch({ limit: 100 }); // 过滤出发送时间早于7天前的旧消息 const oldMessages = messages.filter(m => m.createdTimestamp < sevenDaysAgo); // 批量删除符合条件的消息 if (oldMessages.size > 0) { await channel.bulkDelete(oldMessages, true); }
注意事项
- Discord原生
bulkDelete接口仅支持删除发送时间距今14天以内的消息,超过14天的消息无法通过该接口批量删除,需要单独调用单条消息删除接口处理 - 代码中
bulkDelete的第二个参数传true会自动过滤掉超过14天、无法批量删除的消息,避免触发接口报错
内容的提问来源于stack exchange,提问作者sonix
相关产品推荐
相关产品推荐

