JS聊天机器人翻译回复返回[object Object]问题排查
故障原因
返回[object Object]是因为@iamtraction/google-translate执行后返回的是结构化对象,包含翻译结果、源语言置信度、检测到的源语言等多个字段,并非直接返回翻译后的字符串。直接把对象插入模板字符串时,JS会自动调用对象的toString()方法,默认就会输出[object Object]。
你现有代码还有三个隐性bug:
- 第一次把用户消息翻译成英文时,同样直接传入了翻译返回的完整对象,没有提取实际文本,会导致聊天接口收到的请求参数异常
message.channel.stopTyping()写在fetch请求外层,网络请求还没返回结果就会提前停止输入状态,交互体验不符合预期- 缺少异常捕获逻辑,一旦接口请求或翻译报错,会一直卡在正在输入的状态,也不会给用户任何反馈
修复后完整代码
// 依赖引入移到事件监听外侧,避免每次收到消息都重复加载模块 const translate = require("@iamtraction/google-translate"); client.on("message", async message => { if (message.channel.name == "chatbot") /*name channel*/ { if (message.author.bot) return; message.content = message.content.replace(/@(everyone)/gi, "everyone").replace(/@(here)/gi, "here"); if (message.content.includes(`@`)) { return message.channel.send(`**❌ Please dont mention anyone**`); } message.channel.startTyping(); if (!message.content) { message.channel.stopTyping(); return } // 翻译用户消息为英文,取.text字段拿到实际翻译文本 const userTransRes = await translate(message.content, { to: 'en' }); const userEnText = userTransRes.text; fetch(`https://api.affiliateplus.xyz/api/chatbot?message=${encodeURIComponent(userEnText)}&botname=${client.user.username}&ownername=DEVELOPER_NAME`) .then(res => res.json()) .then(async data => { // 翻译机器人返回内容为葡萄牙语,同样取.text字段 const botPtRes = await translate(data.message, { to: 'pt' }); const botPtText = botPtRes.text; message.inlineReply(botPtText); }) .catch(err => { console.error('聊天请求处理失败:', err); message.inlineReply("当前服务暂不可用,请稍后再试"); }) .finally(() => { // 所有逻辑处理完成后再停止输入状态 message.channel.stopTyping(); }); } });
核心修改点
- 所有翻译接口调用后,统一通过返回对象的
.text属性获取实际翻译后的字符串,禁止直接传入完整响应对象 - 调整输入状态停止逻辑的位置,放在请求的
finally回调中,无论请求成功、失败都会正确收尾 - 补充错误捕获逻辑,避免异常情况下机器人无响应
- 把依赖加载移到事件外层,减少不必要的性能开销
内容的提问来源于stack exchange,提问作者Kauã4op
相关产品推荐
相关产品推荐

