Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2023, 12:21   #1
tarabukinivan
Пользователь
 
Регистрация: 12.08.2011
Сообщений: 12
По умолчанию Немогу разобраться с ассинхронностью в телеграм боте

Код:
const mysql = require("mysql2");
require('dotenv').config()
const TelegramApi = require('node-telegram-bot-api')
const bot = new TelegramApi(process.env.BOT_TOKEN, {polling: true})
var mysqlConfig = require('./my_sql_connect.js');
const cron = require("node-cron");
const shellexe = require('./requests/func.js')
const propotkl=5;
bot.setMyCommands([
  {command: '/add', description: 'Add node: /add xxx.xxx.xxx.xxx:9000'},
  {command: '/delete', description: 'Delete node: /delete xxx.xxx.xxx.xxx:9000'}, 
  {command: '/notif', description: 'show logs'},
  {command: '/notifoff', description: 'hide logs'},  
  {command: '/my', description: 'your nodes'}
])

 const start = () => {
    bot.on('message', async msg => {
      const text = msg.text;     
      
      //console.log(msg)
      if(text === '/start'){
        return bot.sendMessage(msg.from.id, `Welcome!`)
      }

      if(text === '/my'){
        console.log("нажат my")   
        bot.sendMessage(msg.from.id,`Ваши ip: skljfkdsl`)     
        return
      }
      return bot.sendMessage(msg.from.id, `Unknown command`)      
    })
  }
  start()
  var pool=mysql.createPool(mysqlConfig);
  cron.schedule('* */1 * * * *', async () => { 
    let bddata;
    pool.getConnection(function(err,connection){
      if (err) {
       connection.release();
       console.log("ошибка соед");
        //bot.sendMessage(msg.from.id,'нет соединения с БД')        
       reject(err)
      }else{
        console.log("зашли читать БД");
        const sql = `SELECT * FROM userip`;
        pool.query(sql, '',function(err, resp) {
          if(err) {
            //bot.sendMessage(msg.from.id,'не удалось добавить данные')             
            return console.log(err);
          }
          bddata =resp
          console.log("resp")
          if(bddata && bddata!=''){
                bddata.map((val)=>{
                  console.log(val)
                  console.log("curl:")
                  
                  const p = new Promise(function(resolve, reject){
                  //let main = await shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  let tmp = shellexe(`curl --max-time 3 --location --silent --request POST http://${val.ipu} --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  resolve(tmp)
                  })
                  p.then(data=>{
                    console.log(data)
                  })
                })
          //let curlres = proverka();
          console.log("curl res:")
          //console.log(curlres)
            111111
          }else{
            console.log(`База пуста`)
          } 
          connection.release(); // закрываем соединение с базой данных
        })
      }
    });
    console.log("bddata")
  })
Привет! Набросал скрипт для бота и не могу разобраться с асинхронностью.
start() - это функция от бота. Прием команд от пользователя через телегу. Например /my вытаскивает все заведенные ip.

И есть второй раздел с кроном. Который мониторит. Надо чтобы второй раздел с кроном работал как бы независимо от первого. В переменную bddata загружаются сотни ip адресов. Программа вытаскивает айпи и через курл проверяет доступность. 1 адрес через курл занимает 3 секунды. Если адресов много, то это будет долго.

И дело в том, что когда вызываю /my в start, то ответ приходит только после окончания проверки всех ip из базы. Как сделать, чтобы функции в start не зависели от тормоззов функции с курлом?
Т.е. нужно, чтобы при нажатии /my сразу пришел ответ не дождавшись выполнения функции в крон
Спасибо!

Последний раз редактировалось tarabukinivan; 29.01.2023 в 15:18.
tarabukinivan вне форума Ответить с цитированием
Старый 30.01.2023, 09:35   #2
tarabukinivan
Пользователь
 
Регистрация: 12.08.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от tarabukinivan Посмотреть сообщение
Код:
const mysql = require("mysql2");
require('dotenv').config()
const TelegramApi = require('node-telegram-bot-api')
const bot = new TelegramApi(process.env.BOT_TOKEN, {polling: true})
var mysqlConfig = require('./my_sql_connect.js');
const cron = require("node-cron");
const shellexe = require('./requests/func.js')
const propotkl=5;
bot.setMyCommands([
  {command: '/add', description: 'Add node: /add xxx.xxx.xxx.xxx:9000'},
  {command: '/delete', description: 'Delete node: /delete xxx.xxx.xxx.xxx:9000'}, 
  {command: '/notif', description: 'show logs'},
  {command: '/notifoff', description: 'hide logs'},  
  {command: '/my', description: 'your nodes'}
])

 const start = () => {
    bot.on('message', async msg => {
      const text = msg.text;     
      
      //console.log(msg)
      if(text === '/start'){
        return bot.sendMessage(msg.from.id, `Welcome!`)
      }

      if(text === '/my'){
        console.log("нажат my")   
        bot.sendMessage(msg.from.id,`Ваши ip: skljfkdsl`)     
        return
      }
      return bot.sendMessage(msg.from.id, `Unknown command`)      
    })
  }
  start()
  var pool=mysql.createPool(mysqlConfig);
  cron.schedule('* */1 * * * *', async () => { 
    let bddata;
    pool.getConnection(function(err,connection){
      if (err) {
       connection.release();
       console.log("ошибка соед");
        //bot.sendMessage(msg.from.id,'нет соединения с БД')        
       reject(err)
      }else{
        console.log("зашли читать БД");
        const sql = `SELECT * FROM userip`;
        pool.query(sql, '',function(err, resp) {
          if(err) {
            //bot.sendMessage(msg.from.id,'не удалось добавить данные')             
            return console.log(err);
          }
          bddata =resp
          console.log("resp")
          if(bddata && bddata!=''){
                bddata.map((val)=>{
                  console.log(val)
                  console.log("curl:")
                  
                  const p = new Promise(function(resolve, reject){
                  //let main = await shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  let tmp = shellexe(`curl --max-time 3 --location --silent --request POST http://${val.ipu} --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  resolve(tmp)
                  })
                  p.then(data=>{
                    console.log(data)
                  })
                })
          //let curlres = proverka();
          console.log("curl res:")
          //console.log(curlres)
            111111
          }else{
            console.log(`База пуста`)
          } 
          connection.release(); // закрываем соединение с базой данных
        })
      }
    });
    console.log("bddata")
  })
Привет! Набросал скрипт для бота и не могу разобраться с асинхронностью.
start() - это функция от бота. Прием команд от пользователя через телегу. Например /my вытаскивает все заведенные ip.

И есть второй раздел с кроном. Который мониторит. Надо чтобы второй раздел с кроном работал как бы независимо от первого. В переменную bddata загружаются сотни ip адресов. Программа вытаскивает айпи и через курл проверяет доступность. 1 адрес через курл занимает 3 секунды. Если адресов много, то это будет долго.

И дело в том, что когда вызываю /my в start, то ответ приходит только после окончания проверки всех ip из базы. Как сделать, чтобы функции в start не зависели от тормоззов функции с курлом?
Т.е. нужно, чтобы при нажатии /my сразу пришел ответ не дождавшись выполнения функции в крон
Спасибо!
Пробовал весь цикл обернуть промисом:
Код:
 bddata =resp
          console.log("resp")
          if(bddata && bddata!=''){
            const p = new Promise(function(resolve, reject){
              console.log("начало цикла")
                bddata.map((val)=>{
                  //let main = await shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  shellexe(`curl --max-time 3 --location --silent --request POST http://${val.ipu} --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                 
                })
                console.log("конец цикла")
                resolve(tmp)
              })
              p.then(data=>{
                console.log(data)
              })
          //let curlres = proverka();
          console.log("curl res:")
          //console.log(curlres)
            111111
          }else{
            console.log(`База пуста`)
          } 
          connection.release();
и даже так:
Код:
bddata =resp
          console.log("resp")
          const p = new Promise(function(resolve, reject){
         if(bddata && bddata!=''){
            
              console.log("начало цикла")
              
                bddata.map((val)=>{
                  let main = shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                  
                  //let res = shellexe(`curl --max-time 3 --location --silent --request POST http://${val.ipu} --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`)
                 console.log(main)
                })
                
                resolve(1)
              
          //let curlres = proverka();          
          //console.log(curlres)
            111111
          }else{
            console.log(`База пуста`)
          }  
        })
        p.then(data=>{
          console.log(data)
        })
          connection.release(); // закрываем соединение с базой данных
        })
Все равно ждет конец цикла, парсит все курл, только потом идет выполнять /my

Последний раз редактировалось tarabukinivan; 30.01.2023 в 14:25.
tarabukinivan вне форума Ответить с цитированием
Старый 30.01.2023, 14:59   #3
tarabukinivan
Пользователь
 
Регистрация: 12.08.2011
Сообщений: 12
По умолчанию

Пусть код будет так:
Код:
const mysql = require("mysql2");
require('dotenv').config()
const TelegramApi = require('node-telegram-bot-api')
const bot = new TelegramApi(process.env.BOT_TOKEN, {polling: true})
var mysqlConfig = require('./my_sql_connect.js');
const cron = require("node-cron");
const shellexe = require('./requests/func.js')
const propotkl=5;
bot.setMyCommands([
  {command: '/add', description: 'Add node: /add xxx.xxx.xxx.xxx:9000'},
  {command: '/delete', description: 'Delete node: /delete xxx.xxx.xxx.xxx:9000'}, 
  {command: '/notif', description: 'show logs'},
  {command: '/notifoff', description: 'hide logs'},  
  {command: '/my', description: 'your nodes'}
])

 const start = () => {
    bot.on('message', async msg => {
      const text = msg.text;     
      
      //console.log(msg)
      if(text === '/start'){
        return bot.sendMessage(msg.from.id, `Welcome!`)
      }

      if(text === '/my'){
        console.log("нажат my")   
        bot.sendMessage(msg.from.id,`Ваши ip: skljfkdsl`)     
        return
      }
      return bot.sendMessage(msg.from.id, `Unknown command`)      
    })
  }
  start()
  
  //var pool=mysql.createPool(mysqlConfig);
  cron.schedule('* */1 * * * *', async () => { 

    const p = new Promise(function(resolve, reject){
      let main =[]
      for(var i = 0; i < 7;i++){
        main.push(shellexe(`curl --max-time 3 --location --silent --request POST https://fullnode.testnet.sui.io:443 --header 'Content-Type: application/json' --data-raw '{ "jsonrpc":"2.0", "method":"sui_getTotalTransactionNumber","id":1}' 2>&1`))
      }
      resolve(main)     
    })
    p.then(data =>{
      console.log(data)
    })
    
  })
Мне нужно как-то for обернуть в промис, чтобы /my отвечал моментально. В таком виде при вызове /my в start ответ приходит не сразу. Отвечат только когда for завершится.
tarabukinivan вне форума Ответить с цитированием
Старый 01.02.2023, 10:31   #4
tarabukinivan
Пользователь
 
Регистрация: 12.08.2011
Сообщений: 12
По умолчанию

Спасибо за помощь! Похоже дело в функции shell. Решил сделать через request-promise. Там все работает!)
tarabukinivan вне форума Ответить с цитированием
Старый 01.02.2023, 20:08   #5
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,455
По умолчанию

Незачто, всегда рады помочь ))
uberchel вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как принять оплату в телеграм боте биткоином ray34 Python 1 05.01.2020 23:49
Немогу разобраться в проблеме!!! yokozyna Помощь студентам 2 02.01.2013 14:21
C# Немогу разобраться с анаграммами. Kil001 Помощь студентам 0 05.05.2012 20:20
немогу разобраться с БД tatarinKZ Помощь студентам 1 21.01.2009 14:35