Node.js开发Telegram Bot发送用户联系人时出现[polling_error]未处理错误求助
Node.js开发Telegram Bot发送用户联系人时出现[polling_error]未处理错误求助
我之前也碰到过一模一样的问题,其实这个错误的根源很好找——你的Bot代码没有处理「用户发送联系人」这种非文本类型的消息,而且还存在潜在的逻辑漏洞,导致Polling过程中触发了未捕获的错误。
问题分析
你当前的代码只监听了message事件,但只处理了msg.text为/start的文本消息场景:
- 当用户点击「Отправить」按钮发送联系人时,这条消息的
msg.text是undefined(因为这不是文本消息,而是contact类型消息,数据存在msg.contact字段里) - 你的代码直接执行
msg.text.toLocaleLowerCase(),这会触发Cannot read properties of undefined (reading 'toLocaleLowerCase')的错误 - 虽然联系人本身成功发送了,但这个未处理的错误被Telegram Bot的Polling机制捕获,就输出了你看到的
[polling_error] {}
解决方案
给你修改后的完整代码,我加上了对联系人消息的处理、非文本消息的过滤,还有全局错误捕获:
bot.telegramBot.on("message", (msg) => { const { id } = msg.chat; const { first_name } = msg.from; // 优先处理联系人消息 if (msg.contact) { // 提取用户发送的手机号 const userPhone = msg.contact.phone_number; // 发送确认消息 bot.telegramBot.sendMessage(id, `Привет ${first_name}! Спасибо за авторизацию. Ваш номер: ${userPhone}`); return; // 处理完直接返回,避免进入后续文本消息逻辑 } // 过滤非文本消息,避免调用msg.text时报错 if (!msg.text) { console.log("收到非文本消息,跳过处理"); return; } switch (msg.text.toLocaleLowerCase()) { case "/start": bot.telegramBot.sendMessage( id, `${first_name}, Вас приветствует Телеграм Бот - MyClub! Для авторизации необходимо отправить свой номер телефона.`, { reply_markup: { keyboard: [ [ { text: "Отправить", request_contact: true, }, ], ], }, } ); break; // 可以在这里添加其他命令的处理逻辑 default: // 处理未知命令,提升用户体验 bot.telegramBot.sendMessage(id, "Извините, я не понимаю эту команду. Попробуйте снова!"); } }); // 全局监听Polling错误,打印详细信息方便排查 bot.telegramBot.on("polling_error", (err) => { console.error("Polling错误详情:", err.message || err); });
关键修改点说明
- 新增联系人消息处理:通过
msg.contact判断是否是联系人消息,直接提取手机号并完成后续逻辑 - 过滤非文本消息:先检查
msg.text是否存在,避免后续调用字符串方法时触发报错 - 添加default分支:处理用户发送的未知文本命令,避免Bot无响应的情况
- 全局Polling错误监听:能打印出具体的错误信息,而不是只显示空的
[polling_error] {},方便以后排查其他问题
这样修改后,你再测试发送联系人,控制台就不会再出现那个错误了,同时Bot的逻辑也更健壮~
备注:内容来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

