如何将数据库查询结果拆分为每条含3条记录的多条聊天消息发送
数据库查询结果拆分多条消息发送实现方案
- 第一步修改SQL语句,移除原有的LIMIT 3限制,拉取所有匹配的记录
- 第二步对查询返回的记录数组做分片处理,每3条分为一组
- 第三步遍历分片后的数组,依次调用发送消息接口推送每组内容
- 注意:原代码直接拼接用户输入到SQL语句存在SQL注入风险,建议替换为sequelize的参数化查询写法
修改后的实现代码如下:
bot.on('message', async (message) => { const {text, chat} = message; const {id: chatId} = chat; try { // 参数化查询避免SQL注入,同时移除LIMIT限制拉取所有匹配记录 const [rows] = await sequelize.query( `SELECT book FROM books t WHERE (t.*)::text LIKE ?`, {replacements: [`%${text}%`]} ); if (rows.length) { // 数组分片:每3条分为一组 const chunkSize = 3; const recordChunks = []; for (let i = 0; i < rows.length; i += chunkSize) { recordChunks.push(rows.slice(i, i + chunkSize)); } // 遍历分片依次发送消息,若要避免触发平台限流可在两次发送之间加延时 for (const chunk of recordChunks) { const response = chunk.map(row => row.book).join("\n"); await bot.sendMessage(chatId, response); // 可选:每次发送后等待500毫秒再发下一条,取消注释即可生效 // await new Promise(resolve => setTimeout(resolve, 500)); } } else { await bot.sendMessage(chatId, '未找到匹配的书籍'); } } catch (error) { console.error(error.message); await bot.sendMessage(chatId, 'book not found'); } })
内容的提问来源于stack exchange,提问作者anonym
相关产品推荐
相关产品推荐

