Функции Telegraf и Cloud: как запретить Telegram Bot получать бесконечные старые обновления - PullRequest
0 голосов
/ 06 февраля 2020

Я написал простого бота Telegram, использующего инфраструктуру Telegraf, и развернул его в облачной функции Firebase, и все хорошо, пока однажды вечером не было ошибки, и бот просто перестал отвечать. После некоторой отладки я снова развернул резервное копирование в облачные функции, и целый ряд старых сообщений просто затопляет чат.

Я прочитал, что он как-то связан с getUpdates, и что мне нужно отправить ответ 200, когда сообщение было успешно отправлено. Это всегда было на месте, но почему-то это не работает.

Вот моя реализация:

//at functions/index.js
const functions = require('firebase-functions');
const bot = require('./bot')

exports.start = functions.https.onRequest((req, res) => {
    return bot.handleUpdate(req.body, res)
    .then(() => {
        res.status(200).send();
    })
    .catch((err) => {
        console.log('Function start err', err)
    })
})

// at bot.js
const Telegraf = require('telegraf')
const constants = require('./constants')
const token = constants.telegramBotToken
const bot = new Telegraf(token)

let commands = [
    require('./commands/start'),
    require('./commands/settings'),
    //and a few more commands
]

commands.map((command) => {
    return command(bot)
})

bot.launch()
module.exports = bot

//An example at command code, ie at /commands/start
module.exports = (bot) => bot.start((ctx) => {
    let msg = ctx.message
    let userFirstName = msg.from.first_name
    let startMessage = `
    <b>Hello ${userFirstName}!</b> blahblah`
    var option = {
        "parse_mode": "HTML",
    }

    ctx.reply(startMessage)
    .catch((err) => {
       console.log('/start error', err)
    })
})

Я следую этому учебнику по развертыванию, попробовал следующее, но не все решают:

  1. Удаление webhook
  2. Удаление функции запуска облака и повторное развертывание

1 Ответ

0 голосов
/ 06 февраля 2020

Ваша функция должна отправлять ответ клиенту при всех условиях. Прямо сейчас вы отправляете ответ только тогда, когда обещание, возвращенное с handleUpdate, указывает на успех. Вы также должны отправить сообщение об ошибке, если оно не выполнено:

.catch((err) => {
    console.log('Function start err', err)
    res.send(500)
})

Это просто базовая c 500 ошибка, но вы должны отправить все, что хотите.

Если ваша функция не работает Если вы не отправите ответ, то по истечении 60 секунд по умолчанию он истечет.

...