uni-app UTs插件中reject返回的UniError类型错误,catch到的error永远是string类型,并且汉字变成Unicode 编码

uni-app UTs插件中reject返回的UniError类型错误,catch到的error永远是string类型,并且汉字变成Unicode 编码 如下面代码所示,uts使用reject返回异常使用UniError,在调用的时候,变成了string类型,并且汉字变成了Unicode编码,变成了:\U6062\U590d\U8d2d\U4e70\U5931\U8d25

@UTSJS.keepAlive  
export function restorePurchases() : Promise<TransactionsResult> {  
  return new Promise<TransactionsResult>((resolve, reject) => {  
    native().restorePurchases((json : string) => {  
      const res : TransactionsResult = { transactions: txListFromJson(json) }  
      resolve(res)  
    }, (msg : string) => {  
      // reject(new StoreKitFailImpl(9020009, msg))  
      reject(new UniError("dh-storekit", 9020009, "恢复购买失败"))  
    })  
  })  
}

在vue文件里面调用的时候,变成了下面的字符串,我使用typeof err == ‘string’,并且errMsg变成了Unicode编码

 {  
 errCode = 9020009;  
 errMsg = "\U6062\U590d\U8d2d\U4e70\U5931\U8d25";  
 errSubject = "dh-storekit";  
 }  

更多关于uni-app UTs插件中reject返回的UniError类型错误,catch到的error永远是string类型,并且汉字变成Unicode 编码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

欢迎到专业群( uni-app x技术交流群 ) 咨询,群中有相关专业的管理员和群友。

这个问题是 uni-app x 在 iOS 平台上处理 Promise reject 时的一个已知行为差异。
在 uts 插件中使用 reject(new UniError(“dh-storekit”, 9020009, “恢复购买失败”)) 返回错误对象,但在 vue 页面中通过 catch 捕获时,iOS 平台会将 UniError 对象转换为字符串,并且中文字符会被编码为 Unicode 转义序列(如 \u6062\u590d\u8d2d\u4e70\u5931\u8d25)。
根据知识库中 ISSUE 系统的信息,Promise.reject 在 uni-app x 中存在类型推导和跨平台行为差异的问题。参考 Promise.reject 引发的类型推导编译报错 这个已确认的问题,临时解决方案是指定 Promise 的泛型类型。
针对你遇到的情况,建议采用以下方式处理:
方案一:在 catch 中处理 Unicode 编码
在 vue 页面中接收到字符串类型的错误后,手动解码 Unicode:
restorePurchases().then(res => {
// 处理成功
}).catch((err) => {
let errMsg = ‘’;
if (typeof err === ‘string’) {
// 解码 Unicode 转义序列
errMsg = unescape(err.replace(/\u/g, ‘%u’));
} else if (err instanceof UniError) {
errMsg = err.errMsg;
}
console.log(‘错误信息:’, errMsg);
});

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

方案二:修改 reject 方式,传递字符串
在 uts 插件中直接 reject 字符串,避免跨平台对象序列化问题:
reject(JSON.stringify({
errSubject: “dh-storekit”,
errCode: 9020009,
errMsg: “恢复购买失败”
}));

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

然后在 vue 页面中解析:
.catch((err) => {
let errorObj;
if (typeof err === ‘string’) {
try {
errorObj = JSON.parse(err);
} catch(e) {
errorObj = { errMsg: err };
}
}
console.log(errorObj.errMsg); // 正常显示中文
});

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

方案三:使用泛型明确 Promise 类型
参考 ISSUE 系统中的建议,在 uvt 文件中明确指定 Promise 的泛型类型:
export function restorePurchases(): Promise<TransactionsResult> {
return new Promise<TransactionsResult>((resolve, reject) => {
native().restorePurchases((json: string) => {
const res: TransactionsResult = { transactions: txListFromJson(json) }
resolve(res)
}, (msg: string) => {
reject(new UniError(“dh-storekit”, 9020009, “恢复购买失败”))
})
})
}

本助手使用国产模型,生成代码准确率较低。强烈建议使用uni-agent生成代码

这个问题在 iOS 平台上表现尤为明显,主要是由于不同平台对 UniError 对象序列化处理方式的差异导致的。建议在跨平台开发时,对错误处理进行统一的兼容性处理。 内容为 AI 生成,仅供参考

更多关于uni-app UTs插件中reject返回的UniError类型错误,catch到的error永远是string类型,并且汉字变成Unicode 编码的实战教程也可以访问 https://www.itying.com/category-93-b0.html


主要是有两个问题
1:catch里面err类型错误,应该是object类型,变成了string类型
2:返回的汉字编码错误,变成了Unicode字符

回到顶部