小马冲冲
小马冲冲
  • 发布:2025-11-24 09:59
  • 更新:2025-11-24 10:05
  • 阅读:30

跪求大佬,uniappx开发微信小程序时websocket立刻失效,但安卓正常

分类:uni-app x

以下为uniappx的简单websocket代码:

let overallSocket : SocketTask | null = null  

export function openSocket(){  
    let token = ""  
    if(haveToken()){  
        token = getToken() as string  
    }else{  
        return  
    }  
    const webSocketUrl = `wss://....../ws?token=${token}`  

    //判断是否已连接  
    if(isConnected.value)return  
    //进行连接  
    overallSocket = uni.connectSocket({  
        url:webSocketUrl  
    })  

    //回调函数编写  
    //监听打开  
    overallSocket?.onOpen((res:OnSocketOpenCallbackResult)=>{  
        console.log("websocket已打开")  
        isConnected.value = true  
        //重置重连次数  
        resetReconnect()  
    })  

    //监听关闭  
    overallSocket?.onClose(()=>{  
        console.log("websocket已关闭")  
        //已断开  
        isConnected.value=false  
        isOnline.value = false  
    })  

    //监听失败  
    overallSocket?.onError((res:GeneralCallbackResult)=>{  
        console.log(res.errMsg)  
        //已断开  
        isConnected.value=false  
        isOnline.value = false  
        //尝试重连  
        reconnect()  
    })  

    //监听接收消息(兼容后端大模型流式传输)  
    overallSocket?.onMessage((res:OnSocketMessageCallbackResult)=>{  
        try{  
            const d = JSON.parse(res.data as string) as UTSJSONObject  
            const type = d.get("type") as string  
            switch(type){  
                case "welcome":  
                    // 服务端连接欢迎信息,标记在线并广播消息  
                    isOnline.value = true  
                    uni.$emit("onChatBegin")  
                    break  

                case "chat_response_chunk":  
                    // 大模型的流式分片  
                    const chunk = d.get("content") as string  
                    // 广播每个分片,页面可订阅并进行拼接显示  
                    uni.$emit("onChatResponseChunk", chunk)  
                    break  

                case "stream_end":  
                    // 流式结束事件  
                    uni.$emit("onChatResponseEnd")  
                    break  
                default:  
                    // 未知类型,打印以便调试  
                    console.warn("unknown websocket message type:", type)  
            }  
        }catch(e){  
            console.error("failed to parse websocket message:", e)  
        }  
    })  
}  

export function sendMGSSocket(data:SendMSG){  
    try{  
        const payload = JSON.stringify(data)  
        overallSocket?.send({ data: payload })  
    }catch(e){  
        console.error("failed to send websocket message:", e)  
    }  
}

之前这段代码在安卓上测试一切正常,但转到微信小程序上后立马报错,HBuilder X 4.85的语法检测一切正常
以下为微信开发者工具测试时的报错:

TypeError: s.onOpen is not a function  
    at Object.l [as openSocket] (websocket.js? [sm]:1)  
    at Proxy.onLoad (chat.js? [sm]:1)  
    at To (vendor.js? [sm]:7)  
    at Io (vendor.js? [sm]:7)  
    at Array.t.__weh.t.__weh (vendor.js? [sm]:8)  
    at vendor.js? [sm]:8  
    at Proxy.Qi (vendor.js? [sm]:8)  
    at mi.u.onLoad (vendor.js? [sm]:8)  
    at mi.<anonymous> (VM51 WASubContext.js:1)  
    at mi.l.__callPageLifeTime__ (VM51 WASubContext.js:1)(env: Windows,mp,1.06.2504060; lib: 3.11.2)
websocket.js? [sm]:1 failed to send websocket message: TypeError: s.send is not a function  
    at Object.exports.sendMGSSocket (websocket.js? [sm]:1)  
    at Proxy.sendMSG (chat.js? [sm]:1)  
    at To (vendor.js? [sm]:7)  
    at Io (vendor.js? [sm]:7)  
    at i (vendor.js? [sm]:8)  
    at mi.n [as e3] (vendor.js? [sm]:8)  
    at mi.<anonymous> (VM51 WASubContext.js:1)  
    at o.safeCallback (VM51 WASubContext.js:1)  
    at o.call (VM51 WASubContext.js:1)  
    at r (VM51 WASubContext.js:1)(env: Windows,mp,1.06.2504060; lib: 3.11.2)
TypeError: s.close is not a function  
    at Object.exports.closeSocket (websocket.js? [sm]:1)  
    at Proxy.onUnload (chat.js? [sm]:1)  
    at To (vendor.js? [sm]:7)  
    at Io (vendor.js? [sm]:7)  
    at Array.t.__weh.t.__weh (vendor.js? [sm]:8)  
    at vendor.js? [sm]:8  
    at Proxy.Qi (vendor.js? [sm]:8)  
    at mi.n.indexOf.e.<computed> [as onUnload] (vendor.js? [sm]:8)  
    at mi.<anonymous> (VM51 WASubContext.js:1)  
    at mi.l.__callPageLifeTime__ (VM51 WASubContext.js:1)(env: Windows,mp,1.06.2504060; lib: 3.11.2)
2025-11-24 09:59 负责人:无 分享
已邀请:
DCloud_UNI_JBB

DCloud_UNI_JBB

同样的代码,测试一下原生微信小程序有没有这个问题

  • 小马冲冲 (作者)

    您好,以上这些报错就是在微信开发者工具中测试原生微信小程序测试时报错的,我试过直接上传到微信平台,依然是同样的问题,跪求解答?

    2025-11-24 10:10

  • DCloud_UNI_JBB

    回复 小马冲冲: 反馈到微信开发者社区

    2025-11-24 10:11

Ask小助手

Ask小助手

根据您的描述和错误日志,问题在于微信小程序环境下uni.connectSocket()返回的对象不符合预期。关键错误TypeError: s.onOpen is not a function表明overallSocket未正确获取到WebSocket方法。

原因分析:

  1. uni-app x在微信小程序平台需要特殊处理
  2. 根据uni-app x WebSocket文档,微信小程序平台要求使用最新版基础库(≥2.10.0)
  3. 您可能未正确处理connectSocket返回值的平台差异

解决方案:

  1. 检查基础库版本:在微信开发者工具中,确保项目设置的基础库版本≥2.10.0
  2. 添加类型保护:修改代码增加类型检查
    overallSocket = uni.connectSocket({ url: webSocketUrl })  
    // 关键修复:添加平台兼容检查  
    if (!overallSocket || typeof overallSocket.onOpen !== 'function') {  
    console.error('WebSocket初始化失败,请检查基础库版本')  
    return  
    }
  3. 避免全局单例:微信小程序不支持全局单例WebSocket,每次连接都应使用新实例
  4. 更新HBuilderX:确认使用正式版4.85+或alpha 4.86(下载地址

注意事项:

  • 微信小程序要求域名必须完成ICP备案且配置到request合法域名列表中
  • 不要混用uni.onSocketOpen等全局方法(文档说明
  • 安卓/iOS原生平台与小程序平台实现机制不同,需做平台适配

建议参考官方示例:uni-app x WebSocket示例

内容为 AI 生成,仅供参考

要回复问题请先登录注册