You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

discord.js实现Base64编解码遇特殊字符时机器人崩溃问题

问题根源
  • URL参数未做转义:直接将用户输入拼接在接口URL的查询参数中,当文本包含&、#、?、空格、非ASCII字符(中文、emoji等)时,会破坏URL的参数结构,直接导致接口返回错误。
  • 缺少异常处理:所有Axios请求都没有编写错误捕获逻辑,请求失败后抛出的未捕获Promise异常会直接终止Node.js进程,表现为机器人直接崩溃停机。
  • 实现方案不合理:Base64编解码是Node.js原生内置的能力,调用第三方接口不仅会增加网络开销,还会额外引入外部服务依赖的不稳定风险。
  • 代码笔误:编码逻辑的返回卡片标题错写为Decoder,和解码逻辑标题重复。
最优修复方案(原生实现,无外部依赖)

直接用Node.js内置的Buffer对象实现编解码,无网络请求,不存在特殊字符兼容问题,响应速度更快。

// 封装通用编解码方法,自动处理UTF-8字符(中文、emoji不会乱码)
const base64Encode = (str) => Buffer.from(str, 'utf8').toString('base64');
const base64Decode = (b64Str) => Buffer.from(b64Str, 'base64').toString('utf8');

// 编码逻辑示例
try {
  const input = args.slice(1).join(" ");
  const result = base64Encode(input);
  const embed = new MessageEmbed()
   .setTitle('Base64 编码结果')
   .setDescription(result)
   .setColor('RANDOM')
   .setTimestamp();
  message.channel.send({ embeds: [embed] });
} catch (err) {
  console.error('Base64编码失败:', err);
  message.reply('编码失败,请检查输入内容');
}

// 解码逻辑示例
try {
  const input = args.slice(1).join(" ");
  const result = base64Decode(input);
  const embed = new MessageEmbed()
   .setTitle('Base64 解码结果')
   .setDescription(result)
   .setColor('RANDOM')
   .setTimestamp();
  message.channel.send({ embeds: [embed] });
} catch (err) {
  console.error('Base64解码失败:', err);
  message.reply('解码失败,请确认输入为合法的Base64字符串');
}
临时兼容方案(保留第三方接口调用)

如果暂时不想替换原有逻辑,只需要做两处修改即可解决崩溃问题:

  1. 所有拼接到URL的用户输入,必须用encodeURIComponent()做转义,避免特殊字符破坏URL结构
  2. 给所有Axios请求添加.catch()错误捕获,避免异常直接抛到进程层
    修改后的代码如下:
// 编码逻辑
const messages = args.slice(1).join(" ");
Axios.get(`https://some-random-api.ml/base64?encode=${encodeURIComponent(messages)}`)
.then((res) => {
   const embed = new MessageEmbed()
   .setTitle('Base64 编码结果')
   .setDescription(res.data.text)
   .setColor('RANDOM')
   .setTimestamp();
   message.channel.send({embeds: [embed]});
})
.catch(err => {
  console.error('编码请求失败:', err);
  message.reply('编码失败,请稍后重试');
});

// 解码逻辑
const messages = args.slice(1).join(" ");
Axios.get(`https://some-random-api.ml/base64?decode=${encodeURIComponent(messages)}`)
.then((res) => {
   const embed = new MessageEmbed()
   .setTitle('Base64 解码结果')
   .setDescription(res.data.text)
   .setColor('RANDOM')
   .setTimestamp();
   message.channel.send({embeds: [embed]});
})
.catch(err => {
  console.error('解码请求失败:', err);
  message.reply('解码失败,请确认输入为合法的Base64字符串');
});
开发注意事项
  • 所有涉及用户输入拼接为URL的场景,必须对参数做encodeURIComponent()转义,否则不仅会出现请求错误,还可能存在参数注入风险。
  • Node.js环境下所有异步逻辑(网络请求、文件IO等)都必须做异常捕获,未处理的Promise rejection和未捕获的异常都会直接导致进程退出。

内容的提问来源于stack exchange,提问作者user18652045

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:31:01