index.obj.js 2.6 KB
Newer Older
DCloud_JSON's avatar
DCloud_JSON 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
const conversation = require('./conversation.js')
const msg = require('./msg.js')
const push = require('./push.js')
const friend = require('./friend.js')
const group = require('./group.js')
const filtered_conversation = require('./filtered-conversation.js')
const tools = require('./tools.js')

module.exports = {
  async _before() {
    // 记录请求时间
    this.requestStartTime = Date.now()
    
    // 获取客户端信息
    this.clientInfo = this.getClientInfo()
    
    // 调用扩展插件的初始化接口
    const { invokeExts } = require('uni-im-ext')
    await invokeExts('ext-init',this.clientInfo)

    // 定义uni-id公共模块对象
    const uniIdCommon = require('uni-id-common')
    this.uniIdCommon = uniIdCommon.createInstance({
      clientInfo: this.clientInfo
    })

    // 除非特定方法允许未登录用户调用,其它都需要验证用户的身份
    const allowedMethodsWithouLogin = []
    if (!allowedMethodsWithouLogin.includes(this.getMethodName())) {
      if (this.getClientInfo().source == 'function') {
        // 云函数互调时,免校验 token 直接使用传来的用户 id
        this.current_uid = this.getParams()[1]
        this.current_user_role = []
      } else {
        // 客户端调用时验证 uni-id token
        let res = await this.uniIdCommon.checkToken(this.clientInfo.uniIdToken)
        // console.log('checkToken res',res);
        if (res.errCode) {
          // 如果token校验出错,则抛出错误
          throw res
        }

        // token 有效,取出 id 和角色
        this.current_uid = res.uid
        this.current_user_role = res.role
      }
    }

    // 为方便云对象内部调用 sendPushMsg() 方法,把它挂在云对象实例上
    this.sendPushMsg = push.sendPushMsg

    // 提供一个方法,用于添加并发任务
    this._promises = []
    this.addPromise = (promise) => {
      this._promises.push(promise)
    }
  },

  async _after(error, result) {
    // 请求完成时间
    console.error('请求完成时间', Date.now() - this.requestStartTime, 'ms')
    
    if (error) {
      // console.log({
      // 	error,
      // 	result
      // });
      if (error.errCode && error.errMsg) {
        // 符合响应体规范的错误,直接返回
        return error
      } else {
        throw error // 直接抛出异常
      }
    }

    // 如果有并发任务,则等它们都执行完再返回
    if (this._promises.length > 0) {
      await Promise.all(this._promises)
    }

    return result || { errCode: 0 }
  },

  ...conversation,
  ...msg,
  ...push,
  ...friend,
  ...group,
  ...filtered_conversation,
  ...tools,
}