리소스 상세 · 消息处理
按会话合并短时间内的连续消息
把时间间隔接近的短消息合成一个文本批次,分别维护每个会话的尾部状态,同时限制字符数和消息条数,避免不同会话的内容混在一起。
본문, 예시와 라이선스는 원문을 유지합니다. 코드를 표시할 뿐 온라인으로 실행하거나 AI를 호출하지 않습니다.
리소스 상세
适合学习分组、滑动时间窗口和输入校验。示例处理已经收到的一组文本,不包含平台接口;正式接入时需另外处理权限、去重、重试和定时触发,并避免在日志中记录消息正文。
시작 전 준비
- 지원 환경
- Windows · macOS · Linux
- 내용 업데이트
- 准备 Node.js 24 和文本编辑器;本站仅在 Node.js v24.19.0 的本地环境核对附带示例。
- 准备带 sessionId、text、atMs 的虚构消息,保持接收顺序。
node session-batch.mjs先在文件所在文件夹打开终端。本例无需 npm install,不联网、不调用 AI 接口;不含真实平台接入。
흔한 문제
- 保存为指定 .mjs 文件,避免变成 .mjs.txt;不要复制 Markdown 的三反引号。
- 它只合并已收到的消息数组,不会自动监听平台、去重或延迟发送。
전체 본문
// SPDX-License-Identifier: MIT
// 原创教学示例:输入保持接收顺序;会话标识按原值隔离。
export function mergeMessages(messages, options = {}) {
const { gapMs = 1500, maxChars = 2000, maxCount = 8 } = options;
if (!Array.isArray(messages) || !Number.isFinite(gapMs) || gapMs < 0 ||
!Number.isSafeInteger(maxChars) || maxChars < 1 ||
!Number.isSafeInteger(maxCount) || maxCount < 1) {
throw new TypeError("批次选项无效");
}
const batches = [];
const tails = new Map();
for (const message of messages) {
const { sessionId, text, atMs } = message ?? {};
if (typeof sessionId !== "string" || !sessionId.trim() ||
typeof text !== "string" || !text.trim() ||
!Number.isSafeInteger(atMs) || atMs < 0) {
throw new TypeError("消息需要会话、文本和有效时间");
}
if (text.length > maxChars) throw new RangeError("单条消息过长");
const tail = tails.get(sessionId);
const canAppend = tail && atMs >= tail.lastAt &&
atMs - tail.lastAt <= gapMs && tail.count < maxCount &&
tail.text.length + 1 + text.length <= maxChars;
if (canAppend) {
tail.text += "\n" + text;
tail.lastAt = atMs;
tail.count += 1;
} else {
const batch = { sessionId, text, firstAt: atMs, lastAt: atMs, count: 1 };
batches.push(batch);
tails.set(sessionId, batch);
}
}
return batches; // 返回新对象,不修改输入消息。
}
console.log(mergeMessages([
{ sessionId: "demo-a", text: "你好", atMs: 0 },
{ sessionId: "demo-b", text: "独立会话", atMs: 200 },
{ sessionId: "demo-a", text: "补充一个问题", atMs: 500 },
]));
// 两个批次;demo-a 的两条消息合并,demo-b 单独保留。사용 방법
用资源自带的三条虚构消息观察分组:demo-a 的两条合在一起,demo-b 保持为独立会话。
保存完整代码
复制教学代码及末尾示例,保存为 session-batch.mjs,保留许可证说明,不要把三反引号也放进文件。
运行示例
在文件所在文件夹打开终端,执行下方命令。它只处理文件里写好的三条虚构消息,不读取真实聊天记录。
检查分组依据
结果应有两个批次,demo-a 的 count 为 2,demo-b 为 1。试改 atMs 或 gapMs,可以观察连续消息何时分开;不同会话仍独立处理。
- 저장 파일명
session-batch.mjs- 실행 환경
- Node.js 24;本站实际核验版本为 v24.19.0。使用 .mjs 文件直接运行,不需要安装第三方 npm 依赖。
- 의존성과 비용
- 这段示例不联网、不调用 AI 接口,不产生模型接口费用。运行设备、电力由使用者自行承担;接入真实模型或平台后的费用需另行核对。
실행 명령
node session-batch.mjs예상 출력
[
{
sessionId: 'demo-a',
text: '你好\n补充一个问题',
firstAt: 0,
lastAt: 500,
count: 2
},
{
sessionId: 'demo-b',
text: '独立会话',
firstAt: 200,
lastAt: 200,
count: 1
}
]로컬 검증
2026-10-22 · Node.js v24.19.0
已在本站本地运行资源中原样附带的教学片段,核对下方控制台输出;不代表已验证生产环境、平台接入或所有边界情况。
적합한 용도
- 学习分组与滑动时间窗口
- 理解短消息如何形成独立会话批次
사용 전 주의
- 这里是对已收到的一组消息做计算,不是持续等待新消息的后台机器人。
- 输入应保持接收顺序;示例不替你进行平台鉴权、去重、失败重试或定时发送。
- 控制台对象的缩进可能因运行环境不同而变化,重点核对字段、批次数和文字内容。
작성자와 출처
- 저작자 표시
- 包子海梦 · AI辅助开发
- 작성자와 출처
- 提示集贡献者
고지 및 수정 내용
新编写的通用教学示例,发布前仍需核对来源与运行效果。
전체 라이선스
MIT
MIT License Copyright (c) 2026 提示集贡献者 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
검증 범위
教学代码已运行
已运行完整带许可的教学文件并核对输出;不代表生产部署、平台接入或全部边界情况都已验证。
2026-10-23 Node.js v24.19.0