我看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处理?
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