Javin
Javin
  • 发布:2023-07-22 14:53
  • 更新:2023-07-24 11:32
  • 阅读:1147

如何正确使用uniCloud错误规范

分类:uniCloud

我看uniCloud的错误返回的文档
https://uniapp.dcloud.net.cn/uniCloud/cloud-obj.html#return-value
https://uniapp.dcloud.net.cn/uniCloud/cf-functions.html#resformat
然后我看了uni-id-co/index.obj.s里的代码实现

_after (error, result) {  
    if (error) {  
      // 处理中间件内抛出的标准响应对象  
      if (error.errCode && getType(error) === 'object') {  
        const errCode = error.errCode  
        if (!isUniIdError(errCode)) {  
          return error  
        }  
        return {  
          errCode,  
          errMsg: error.errMsg || this.t(errCode, error.errMsgValue)  
        }  
      }  
      throw error  
    }  
    return Object.assign(this.response, result)  
  }

他在出现错误的时候
return {
errCode,
errMsg
}
的格式在这里他做了i18n的处理,着是否符合规范?
但是当想在schema的扩展js里返回错误的时候遇到了问题,我想统一的采用上述方法
当我
return {
errCode: "xxx"
errMsg: "xxx"
}
并没有自动抛出错误
只有throw new Error("xxx")才会抛出错误提示,所以schema扩展js是否支持这种格式返回错误?
我看这个文档的教程都是throw new Error("xxx")的形式
https://uniapp.dcloud.net.cn/uniCloud/jql-schema-ext.html
如果不支持我要做i18n需要采用 throw new Error(i18n.t("xxx"))的形式吗,如果不支持是为什么?我应该怎么符合规范的返回错误提示?
而且扩展js中好像没有_after方法所以不能像云对象的_after (error, result)方法这样做统一的i18n处理?

2023-07-22 14:53 负责人:无 分享
已邀请:
DCloud_uniCloud_WYQ

DCloud_uniCloud_WYQ

schema扩展只能抛出错误来终止执行,我们这边实现一下把抛出的错误转成响应体规范。下次HBuilderX发版时上线此功能

之后你需要抛出这样的错误

class UniError extend Error {  
  constructor({errMsg, errCode}={}) {  
    super(errMsg)  
    this.code = this.errCode = errCode  
    this.errMsg = errMsg  
  }  
}  

throw new UniError({  
  errCode: 10000,  
  errMsg: '参数错误‘  
})
  • Javin (作者)

    希望云函数云对象和schema扩展抛出错误的用法能统一一下。

    2023-07-24 12:52

  • Javin (作者)

    如果使用

    throw new UniError({

    errCode: 10000,

    errMsg: '参数错误‘

    })

    多语言支持的话需要

    throw new UniError({

    errCode: 10000,

    errMsg: i18n.t(10000)

    })

    用这种形式写吗?


    uni-id-co/index.obj.s

    里只需要

    throw {

    errCode: xxx

    }

    之后在_after里面就可以进行对errMsg进行统一的翻译,而schema扩展里面没有_after好像并没有捕获error的能力所以没办法向云对象那样进行统一的翻译。

    throw new UniError({

    errCode: 10000,

    errMsg: i18n.t(10000)

    })

    这样写确实有点丑

    2023-07-24 13:12

  • DCloud_uniCloud_WYQ

    回复 Javin: 你封装个方法不就解决这个问题了吗?uni-id-co里面也是调用了一个方法

    2023-07-24 15:55

  • DCloud_uniCloud_WYQ

    回复 Javin: 确认了下,jql现在就是支持处理上面的错误的,按上述格式抛出就行

    2023-07-24 16:56

  • Javin (作者)

    回复 DCloud_uniCloud_WYQ: uni-id-co是云对象,但是js扩展不支持不支持errCode,也没有_after函数做统一的处理,麻烦就麻烦在云对象和js扩展的错误规则不统一

    2023-07-29 18:45

  • Javin (作者)

    我也想想写成 myThrow('错误码')的形式,但是因为js扩展就不支持errCode,所以扩展写的错误无法和云对象写的错误函数统一用一个。而且uni-id-co是在_after函数里做的统一的i18n处理,就算js扩展以后有了errCode但因为没有最后的_after阶段所以i18n只能在myThrow函数里立即执行。类似这样。


    myThrow(errCode) {


    throw new UniError({


    errCode: errCode,


    errMsg: i18n.t(errCode)


    })


    }


    这就产生了一种不能统一用一个函数来处理错误的问题,云对象要用云对象的错误处理方法,js扩展要用扩展的。所以当有了throw new UniError()之后,是不是在云对象里的i18n推荐做法也不要放在_after里去做,而是在myThrow里立刻执行。

    2023-07-29 19:08

  • DCloud_uniCloud_WYQ

    回复 Javin: 云对象的方法里面和schema扩展里面是一样的写法,只是云对象_after的逻辑在jql里面自动处理了。你现在遇到的主要是i18n写法不统一的问题吧,如果要统一可以在你的myThrow里面进行

    2023-07-31 11:29

  • Javin (作者)

    回复 DCloud_uniCloud_WYQ: schema扩展里面下个版本是一样的吗?现在不同因为现在如果写return { errorCode: 123 } 是无效的 只能写 throw new Error('123')

    2023-08-01 12:45

要回复问题请先登录注册