收藏
回答

wx.cloud.connectContainer无法连接后端websocket

框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
小程序 Bug wx.cloud.connectContainer 微信安卓客户端 8.0.50及以上 3.5.3

https://developers.weixin.qq.com/minigame/dev/wxcloudrun/src/

问题:wx.cloud.connectContainer无法连接后端websocket,请求网址为'wss://express-u811-prod-xxx-xxx.ap-xxx.run.wxcloudrun.com/ws',报错1006,都没请求到后端。

容器启动绑定端口27082:27081。直接请求ws://127.0.0.1:27081/ws,是能建立连接的。

代码:用的是官方示例

客户端

export const websocketTest = async (flag) => {
  const { socketTask } = await wx.cloud.connectContainer({
    config: {
      env: env,
    },
    service: server_name, // 替换自己的服务名
    path: '/ws'
  })
  socketTask.onMessage(function (res) {
    console.log(flag, '【WEBSOCKET】', res.data)
  })
  socketTask.onOpen(async function (res) {
    console.log(flag,'【WEBSOCKET】', '链接成功!', res)
    socketTask.send({
      data: '这是小程序消息'
    })
  })
  socketTask.onClose(async function (err) {
    console.log(flag,'【WEBSOCKET】链接关闭!')
    console.log(err)
  })
  return socketTask
}

websocketTest('1')
websocketTest('2') // 故意多发起一次链接


node后端

const application = express();
const {app} = expressWS(application)
const connect = {}
app.ws('/ws', function (ws, req) {
  let openid = req.headers['x-wx-openid'] // 从header中获取用户openid信息
  if (openid == null) { // 如果不存在则不是微信侧发起的
    openid = new Date().getTime() // 使用时间戳代替
  }
  if (connect[openid] != null) { // 判断用户是否有连接
    ws.send('当前用户已经在其他设备连接过,无法重复连接') // 发送重复连接信息
    ws.close() // 关闭连接
  } else {
    connect[openid] = { // 记录用户信息
      openid: openid, // 用户openid
      source: req.headers['x-wx-source'] || '非微信', // 用户微信来源
      unionid: req.headers['x-wx-unionid'] || '-', // 用户unionid
      ip: req.headers['x-forwarded-for'] || '未知' // 用户所在ip地址
    }
    console.log('链接请求头信息', req.headers)
    ws.on('message', function (msg) {
      console.log('收到消息:', msg)
      ws.send(`收到-${msg}`)
    })
    ws.on('error', function(error) {
      console.error('WebSocket连接错误:', error);
    });
    ws.on('close', function (code, reason) {
      console.log('链接断开:', openid, code, reason.toString('utf-8'))
      delete connect[openid]
    })
    console.log("end....")
  }
})




回答关注问题邀请回答
收藏

1 个回答

  • 过客
    过客
    08-22

    觉得就是容器网关没能解析这网址,但我又不知如何配置。callContainer的http请求网关就能解析,头疼。大神门救一下

    08-22
    有用
    回复 1
    • 过客
      过客
      08-22
      服了,刚看了容器插件文档,原来不支持websocket。。。
      08-22
      回复
登录 后发表内容