Облачные функции Firebase - «TypeError: Невозможно прочитать свойство« slice »из неопределенного» при создании Telegram Bot - PullRequest
0 голосов
/ 14 апреля 2020

Здравствуйте, я занимаюсь разработкой бота Telegram с использованием облачных функций Firebase [Typescript]

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

Это то, что сохраняет мои журналы облачных функций заполненными, и это продолжает увеличивать мой счет вызова функций ,

Error

То же самое повторяется снова и снова и снова ...

Вот мой код, который в основном получается команда от пользователя и разбивает ее на 2 части, если команда имеет 2 слова.

app.post('/', async (req, res) => {

  const isTelegramMessage = req.body
                          && req.body.message
                          && req.body.message.chat
                          && req.body.message.chat.id
                          && req.body.message.from
                          && req.body.message.from.first_name

  if (isTelegramMessage) {
    const chat_id = req.body.message.chat.id //Telegram User UID   
    const first_name = req.body.message.from.first_name //Telegram User First Name 
    const userInput = JSON.stringify(req.body.message.text)
    //const userTelegramUID = req.body.message.text.id

    if (userInput !== null) {

      const userCommand: string = userInput
      const userCommandSliced: string = userCommand.slice(1, -1)
      const userCommandSlicedLength: number = userCommandSliced.length
      console.log(`User command to split is: ${userCommandSliced} and length ${userCommandSlicedLength}`)

      const finalNumberOfWords: number = userCommand.split(' ').length
      console.log(`Number of words in string = ${finalNumberOfWords}`)

      let returnText: string

      if (finalNumberOfWords === 1) {
        //returnText = userCommand
        if (userCommandSliced === '/start') {
          console.log(`Start function used by ${chat_id}`)
          return res.status(200).send({ 
          method: 'sendMessage',
          chat_id,
          text: `Hello **${first_name}**` 
          }) 
        }
        else{
          console.log(`1 word sent by ${chat_id}`)
          returnText = userCommandSliced
          return res.status(200).send({ 
          method: 'sendMessage',
          chat_id,
          text: `Hello ${first_name}, response to  ${returnText} and this contains ${finalNumberOfWords} words.`
          })
        }
      }
      else if (finalNumberOfWords === 2) {
        let command_array:string[];
        command_array= userCommandSliced.split(" ", 2)

        const commandFn: string = command_array[0]      
        const commandArg: string = command_array[1]

        console.log(`${command_array} is the command array `)
        console.log(`${commandFn} is command function.`)
        console.log(`${commandArg} is argument.`)

        if (commandFn === '/fetch') { 
          //let usernameFetched: string;
          returnText = `${commandFn} used with ${commandArg}`

          let usernameFetched: string
              const snapshot = await admin.database().ref(`/Users/${commandArg}/username`).once("value")
              usernameFetched = snapshot.val()
              console.log(`${usernameFetched} is requested username.`)

              return res.status(200).send({ 
              method: 'sendMessage',
              chat_id,
              text: `Your username is ${usernameFetched}. \n\nCommand used was ${returnText}` 
              })
        }
        console.log(`2 words sent by ${chat_id}`)
      }
      else{
        return res.status(200).send({ 
        method: 'sendMessage',
        chat_id,
        text: `Please don't spam with ${finalNumberOfWords} words in the bot chat.` 
        })
      }
    }
    else{
      return res.status(200).send({ 
      method: 'sendMessage',
      chat_id,
      text: `Null message detected.` 
      })
    }
  }

  return res.status(200).send({ status: 'not a telegram message' })
})

export const router = functions.https.onRequest(app)

РЕДАКТИРОВАТЬ: Здесь моя функция успешно завершается, но все же это происходит. И что более важно, это происходит, даже если я не отправляю телеграммное сообщение [т.е. не вызываю функцию], оно все равно происходит.

Error

И снова мой бот работает, но ошибка увеличивает мои вызовы функций.

bot working

Вызовы функций с момента возникновения этой проблемы.

Rise in invocations

1 Ответ

1 голос
/ 14 апреля 2020

Это потому, что null is! = 'Undefined' в javascript. Так что

Вместо

if (userInput !== null) 

Используйте

if(typeof userInput !== 'undefined')
...