请问有发现真机onChunkReceived后台数据丢失的问题吗?我现在遇到了,没找到解决办法。
enableChunked: true,流式请求,丢包问题!?const requestTask = await wx.request({ method: "POST", enableChunked: true, url: `https://api.coze.cn/v1/workflows/chat`, header: { Accept: "text/event-stream", Authorization: `Bearer ${apiKey}`, "Content-Type": "application/json", "Cache-Control": "no-cache", "X-DashScope-SSE": "enable", // 流式输出 }, responseType: "stream", // 用于处理流式响应 data: data, success: (res) => {
07-01请问有发现真机onChunkReceived后台数据丢失的问题吗?我现在遇到了,没找到解决办法。
生产环境与体验环境(开发环境)的数据切片表现不一致https://developers.weixin.qq.com/miniprogram/dev/api/network/request/RequestTask.onChunkReceived.html 小程序 【小橙有门】- 有门AI 模块 对话时,消息是通过SSE的方式交互,前端通过 requestTask.onChunkReceived 处理数据包。我在体验版中与正式环境中的都使用生产环境的服务API时(统一的后端环境)时,体验版能够正常显示打字机效果,查看调试数据,存在很多的数据包。假设总共有100个字符返回,有50个包的数据被处理,每个数据包有一组~2组数据(onChunkReceived)。但是在生产环境中查看,只有三个数据包,每个包里面有30多组数据。所以没有打字机效果了,显示时是一大段一大段的出现。 [图片][图片][图片] sendMessage() { const { isLoading, inputText, isDeepseek, isOnlineSearch, chatId } = this.data if (isLoading) { return } if (getApp().isNotLoginAndToLoginPage()) { return } const prompt = inputText.trim() if (!prompt) return this.setData({ isLoading: true, messages: [...this.data.messages, { role: 'user', content: prompt }], inputText: '' }) requestTask = doorAiApi.streamChat(prompt, isDeepseek, isOnlineSearch, chatId) loadingChunkCount = 0 requestTask.onChunkReceived(res => { try { this.processChunkData(res.data) } catch (e) { console.error(e) LogUtil.realtimeLog('ai_process_chunk_error', e) } }) }, processChunkData(arrayBuffer) { console.log('arrayBuffer', arrayBuffer) const uint8Array = new Uint8Array(arrayBuffer) const decoder = new TextDecoder() let chunkStr = decoder.decode(uint8Array) // Replace non line breaking spaces chunkStr = chunkStr.replace(/\u00A0/g, ' ') // Split SSE packets const packets = chunkStr.split('\n\n').filter(str => str !== '') console.log('packets', packets) for (const packet of packets) { if (packet.startsWith('data:')) { // Discard incomplete messages if (!SSE_PATTERN.test(packet)) { continue } let jsonStr = packet.replace('data:', '') if (jsonStr == '') { continue } const response = JSON.parse(jsonStr) if (response.success === false) { LogUtil.realtimeLog('ai_network_error', response) ToastUtil.show('服务器错误', 'error') this.abortAiChat() console.error(response.message) break } const thinkText = response.data.think || '' const content = response.data.answer || '' if (content === '[[Done]]') { console.log('steam complete') const chatId = response.data.chatId || undefined this.setData({ chatId }) this.requestDone() break } const streamingThinkText = this.data.streamingThinkText + sanitizeText(thinkText) const streamingText = this.data.streamingText + sanitizeText(content) this.setData({ streamingThinkText, streamingText, streamingTextNodes: towxml(streamingText, 'markdown', {}) }) // Control Content Scroll Down if (loadingChunkCount < 100) { wx.nextTick(() => { this.scrollToBottom() }) loadingChunkCount += 1 } } } }, onInput(e) { this.setData({ inputText: e.detail.value }) }, abortAiChat() { if (requestTask) { console.log('request abort') requestTask.abort() this.requestDone() } }, requestDone() { this.setData({ isLoading: false, messages: [ ...this.data.messages, { role: 'assistant', thinkText: this.data.streamingThinkText, content: this.data.streamingText, contentNodes: this.data.streamingTextNodes } ], streamingThinkText: '', streamingText: '', streamingTextNodes: {} }) requestTask = null },
07-01请问有发现真机onChunkReceived后台数据丢失的问题吗?我现在遇到了,没找到解决办法。
RequestTask onChunkReceived接受数据为什么会乱序?wx.request({ url, method: 'POST', header: { Accept: 'text/event-stream', Authorization: 'Bearer ' + tokens.get(), traceId: random(), ...header, }, enableChunked: true, data: params, success: () => { success(); }, fail: (err) => { console.log('流接口错误', err); fail(); }, complete: () => { console.log('完成'); complete(); }, }); reqTask.onChunkReceived((res) => { const arrayBuffer = res.data; const uint8Array = new Uint8Array(arrayBuffer); const originStr = new TextEncoding.TextDecoder('utf-8').decode(uint8Array); console.log('原始数据', originStr); const formatStr = 'data:'; const formatStrLen = formatStr.length; const parsedData = originStr .split('\n') .filter((txt) => txt.trim() !== '') .map((txt) => { const str = txt.startsWith(formatStr) ? txt.slice(formatStrLen) : txt; try { return str.trim() ? JSON.parse(str) : null; } catch (e) { console.error('JSON.parse error', e, str); return null; } }) .filter((data) => data !== null); // 过滤掉解析错误的项 const sortedData = [...parsedData].sort((a, b) => a.data.n - b.data.n); // 按 n 值排序 sortedData.forEach((data) => { receivedData(data, reqTask); }); }) [图片][图片] 返回的数据中有个 n 字段,是实际的数据顺序,现在完全是乱的。 而且后端是是一条一条给的数据,onChunkReceived 却是一段一段接受的,是为什么?
07-01请问有发现真机onChunkReceived后台数据丢失的问题吗?我现在遇到了,没找到解决办法。
RequestTask.onChunkReceived本地环境一个字一个字展示,真机就是一整段展示?[图片]
07-01顶一下
RequestTask.onChunkReceived数据丢失(本地丢失少,线上丢失过多)?springboot后端SSE流式接口看日志是返回完整的markdow格式,但是RequestTask.onChunkReceived出现数据部分丢失(本地的微信开发工具调试少有丢失,线上版本丢失很严重,用的都是正式版本的后端接口),导致markdown格式化成文本出错,前端内容出现错位及阅读性障碍。麻烦告知解决方案,本地与线上数据丢失偏移过大。
06-26你好,请问找到解决办法了吗?我也遇到了相同的问题,头大。
RequestTask.onChunkReceived 接受部分数据丢失 后端日志返回了完整数据?确认过 后端返回的数据是完整的 但前端接受的数据 经常 会部分丢失 或 格式错乱 有解决的方法吗 急等 [图片][图片]
06-25