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:
- Разделите строки, которые пришли из БД, на N элементов, уменьшив их с помощью splice
- Затем этот фрагмент преобразуется в массив названий книг с помощью map
- Преобразуйте фрагмент названий книг в сообщение, объединив по некоторой логике, в нашем случае с символом новой строки
- Поместите его в массив сообщений
- Наконец, повторите этот массив и отправьте
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!