Как разделить результат на несколько сообщений?

node.js #telegram-bot

#node.js #telegram-бот

Вопрос:

Например, результат запроса к базе данных предполагает вывод 50 записей. Эти записи выдаются в одном сообщении чата, которое трудно проанализировать. Как разделить результат на несколько сообщений по 3 записи в каждом?

 bot.on('message', async (message) => {
        const {text, chat} = message;
        const {id: chatId} = chat;

        let response = '';

        try {
            const [rows] = await sequelize.query(`SELECT book FROM books t WHERE (t.*)::text LIKE '%${text}%' LIMIT 3`);
            if (rows.length) {
                response = rows.map(row => row.book).join("n");
            } else {
                response = 'text';
            }
        } catch (error) {
            console.error(error.message);
            response = 'book not found';
        } finally {
            if (response) {
                bot.sendMessage(chatId, response);
            }
        }
    })
 

Ответ №1:

  1. Разделите строки, которые пришли из БД, на N элементов, уменьшив их с помощью splice
  2. Затем этот фрагмент преобразуется в массив названий книг с помощью map
  3. Преобразуйте фрагмент названий книг в сообщение, объединив по некоторой логике, в нашем случае с символом новой строки
  4. Поместите его в массив сообщений
  5. Наконец, повторите этот массив и отправьте
 bot.on('message', async (payload) => {
  const {text, chat} = payload;
  const {id: chatId} = chat;

  const BOOKS_PER_MESSAGE = 3;
  let messages = [];

  try {

    const query = `SELECT book FROM books t WHERE (t.*)::text LIKE '%${text}%'`;
    let [rows] = await sequelize.query(query);

    while(rows.length) {
      const chunk = rows.splice(0, BOOKS_PER_MESSAGE); // [1]
      const books = chunk.map(row => row.book);        // [2]
      const message = books.join("n");                // [3]
      messages.push(message);                          // [4]
    }

  } 
  catch (error) {
    console.error(error.message);
  } 
  finally {
    if (!messages.length) {
      bot.sendMessage(chatId, 'Book not found');
      return;
    }
    messages.forEach(message => 
                     bot.sendMessage(chatId, message)); // [5]
  }
});
 

Комментарии:

1. Спасибо за ваш ответ, он работает так, как ожидалось! Для меня это очень полезно для дальнейшего изучения Node.js и JavaScript!