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

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);
});

关键修改点说明

  1. 新增联系人消息处理:通过msg.contact判断是否是联系人消息,直接提取手机号并完成后续逻辑
  2. 过滤非文本消息:先检查msg.text是否存在,避免后续调用字符串方法时触发报错
  3. 添加default分支:处理用户发送的未知文本命令,避免Bot无响应的情况
  4. 全局Polling错误监听:能打印出具体的错误信息,而不是只显示空的[polling_error] {},方便以后排查其他问题

这样修改后,你再测试发送联系人,控制台就不会再出现那个错误了,同时Bot的逻辑也更健壮~

备注:内容来源于stack exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:09:37