Discord.js+Node.js运行报SyntaxError: Unexpected token '{'如何解决
问题排查与修复方案
1. 报错根因定位
你遇到的SyntaxError: Unexpected token '{'报错的直接原因是以下代码行语法错误:
mcash[${user.id}, ${message.guild.id}].mcash++;
模板变量语法${}必须包裹在反引号`中才能被JS正确解析,你直接写在方括号内属于非法语法。同时用逗号分隔两个变量作为对象键的写法不符合需求,逗号运算符会返回最后一个表达式的结果,也就是只会将message.guild.id作为键,无法实现用户+服务器的唯一索引。
除此之外你的代码还存在其他隐藏问题:
MessageEmbed.setDescription仅接收一个字符串参数,你传了两个参数还调用了浏览器专属的alert方法,Node.js环境无该API会额外报错- 代码末尾多了多余的闭合括号
}});,需要和上层函数/事件监听的括号配对 - 输入的金额没有转数字类型,叠加时会出现字符串拼接问题
- 没有做用户初始数据判空,首次给新用户加钱时会报读取undefined错误
- 原有角色校验代码只调用了方法没有接收返回值做权限判断
2. 修复后代码(满足金额叠加需求)
const fs = require('fs'); // 先做数据初始化,避免重启后数据丢失 let mcash = {}; if(fs.existsSync("./usercash.json")) { mcash = JSON.parse(fs.readFileSync("./usercash.json")); } // 原有业务逻辑修复 let user = message.mentions.users.first(); if (message.mentions.users.size < 1) return message.reply('Вы должны упомянуть кого-нибудь, чтобы выдать АРы.').catch(console.error); // 提取输入金额并做合法性校验 let pcash = Number(args.slice(1).join(" ")); if(isNaN(pcash) || pcash <= 0) return message.reply("请输入合法的正整数金额").catch(console.error); // 生成用户+服务器的唯一联合键 const userKey = `${user.id}_${message.guild.id}`; // 初始化新用户数据 if(!mcash[userKey]) mcash[userKey] = { mcash: 0 }; // 叠加金额 mcash[userKey].mcash += pcash; // 写入本地存储 fs.writeFile("./usercash.json", JSON.stringify(mcash), err => { if(err) throw err; }); // 权限校验逻辑 const isBanker = member.roles.cache.has('899099537979899924') || member.roles.cache.some(role => role.name === 'Банкир'); if(!isBanker) return message.reply("仅银行家角色可执行该操作").catch(console.error); // 构造消息推送 const embed = new Discord.MessageEmbed() .setDescription(`Пополнение из банка: ${mcash[userKey].mcash}`) .setThumbnail('https://media.discordapp.net/attachments/899085238955806742/899102776263573574/200.png?width=180&height=180') message.author.send( {embeds:[embed] });
3. 额外注意事项
- 确保
member变量已经正确定义,未定义的话可以通过const member = message.guild.members.cache.get(user.id)获取目标用户的服务器成员对象 - 注意和上层的事件回调、函数的括号配对,删除原有冗余的闭合括号
内容的提问来源于stack exchange,提问作者kish3r
相关产品推荐
相关产品推荐

