uni-app x下导入、使用云对象报错

uni-app x下导入、使用云对象报错

示例代码:

const example = uniCloud.importObject("example", {  
    customUI: true  
})  
console.error(example)  
example.test('aaa').then<void>((result : UTSJSONObject) : void => {  
    console.error(result)  
}).catch<void>((err : any | null) : void => {  
    const error = err as UniCloudError  
    console.error(error)  
})

操作步骤:

  1. 克隆项目:https://gitcode.net/AaBbCclqx2020/Uniappx/-/tree/master/
  2. 分别使用标准基座和自定义基座打包
  3. 运行测试

预期结果:

如上

实际结果:

如上报错信息

bug描述:

使用官方示例hello-uni-app-x项目,无论打自定义基座还是标准基座,云对象示例都正常运行,

在项目里导入、使用云对象,均出现不同情况报错

以下是出现报错的代码

const example = uniCloud.importObject("example", {  
    customUI: true  
})  
console.error(example)  
example.test('aaa').then<void>((result : UTSJSONObject) : void => {  
    console.error(result)  
}).catch<void>((err : any | null) : void => {  
    const error = err as UniCloudError  
    console.error(error)  
})

以上云对象和其导入、使用的方法是参考hello-uni-app-x项目中的示例的

【标准基座】

刚开始,是直接用的标准基座进行真机运行调试,

在uni-app x项目下导入云对象成功

输出云对象方法,所有方法正常输出

{"test":"f () { [native code] } "} at pages/index/index.uvue:79

调用test方法,正常输出:

[Object] {"errCode":0,"errMsg":"This is a test text."} 

【自定义基座】

因为插件需要导入第三方依赖,换成了自定义基座打包

在uni-app x项目下导入云对象成功
输出云对象方法,所有方法正常输出

{"test":"f () { [native code] } "} at pages/index/index.uvue:79

调用test方法后报错:java.lang.NoClassDefFoundError: Failed resolution of: Lio/dcloud/uniapp/extapi/UniStorageKt;‌

error: java.lang.NoClassDefFoundError: Failed resolution of: Lio/dcloud/uniapp/extapi/UniStorageKt;
at pages/index/index.uvue:80:4
     })
     console.error(example)
     example.test('This is a test text.').then<void>((result : UTSJSONObject) : void => {
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      console.error(result)
     }).catch<void>((err : any | null) : void => {

开始以为是项目的其他原因(毕竟打包的hello-uni-app-x项目是正常运行的)

便按照模板,新建一个uni-app x项目,在index.uvue文件中使用同样代码,

标准基座

还是先用标准基座,结果符合预期,没有报错

[Object] {"errCode":0,"errMsg":"This is a test text."} 

自定义基座

打包自定义基座后,运行后出现报错

07:11:57.263 java.lang.NoClassDefFoundError: Failed resolution of: Lio/dcloud/unicloud/UniCloudClientKt;
    at uni.UNI5DF8C7C.IndexKt.<clinit>(index.kt:76)
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:454)
    at java.lang.Class.forName(Class.java:379)
    at io.dcloud.uniapp.appframe.UniAppEngineHost.invokeAppMain$lambda$0(UniAppEngineHost.kt:93)
    at io.dcloud.uniapp.appframe.UniAppEngineHost.$r8$lambda$B5PJVjjKP17XAQPUBDiJnlRXnaw(Unknown Source:0)
    at io.dcloud.uniapp.appframe.UniAppEngineHost$$ExternalSyntheticLambda2.run(Unknown Source:8)
    at android.os.Handler.handleCallback(Handler.java:942)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loopOnce(Looper.java:223)
    at android.os.Looper.loop(Looper.java:324)
    at android.app.ActivityThread.main(ActivityThread.java:8599)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1061)
Caused by: java.lang.ClassNotFoundException: Didn't find class "io.dcloud.unicloud.UniCloudClientKt" on path: DexPathList[[dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/index/classes.dex", dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/pages/index/index/classes.dex", dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/uniCloud/cloudfunctions/GenCloudObjUniCaptchaCo/classes.dex", dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/uniCloud/cloudfunctions/GenCloudObjUniIdCo/classes.dex", dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/uniCloud/cloudfunctions/GenCloudObjUniOpenBridge/classes.dex", dex file "/storage/emulated/0/Android/data/com.singmy.uniappxtest/apps/__UNI__5DF8C7C/www/uniCloud/cloudfunctions/GenCloudObjUniPushCo/classes.dex", zip file "/data/app/~~7gjQd4lcEle6o1zn4vFBqw==/com.singmy.uniappxtest-2_wSbsqCwnmw8X1LfYaYSQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~7gjQd4lcEle6o1zn4vFBqw==/com.singmy.uniappxtest-2_wSbsqCwnmw8X1LfYaYSQ==/lib/arm64, /data/app/~~7gjQd4lcEle6o1zn4vFBqw==/com.singmy.uniappxtest-2_wSbsqCwnmw8X1LfYaYSQ==/base.apk!/lib/arm64-v8a, /system/lib64, /system/system_ext/lib64]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    ... 15 more
07:12:24.413 watch Error: EPERM: operation not permitted, watch
07:12:24.413     at FSEvent.FSWatcher._handle.onchange (node:internal/fs/watchers:204:21) {
07:12:24.413   errno: -4048,
07:12:24.413   syscall: 'watch',
07:12:24.413   code: 'EPERM',
07:12:24.413   filename: null
07:12:24.413 }

同类问题

使用uni.request API也会出现同样问题

出错代码段

onLoad() {  
    uni.request({  
        url: 'https://www.baidu.com',  
        method: 'GET',  
        header: {  
            "User-Agent": "Dalvik/2.1.0 (Linux; U; Android 9;)"  
        },  
        success(res) {  
            console.log('OUTPUT', res)  
        }  
    });  
}

标准基座运行结果(正常输出)

OUTPUT,  [Object] {"cookies":[],"data":"<!DOCTYPE html>\r\n<!--STATUS OK--><html> <head><meta http-equiv=cont...} at pages/index/index.uvue:35

自定义基座运行结果(报错)

error: java.lang.NoClassDefFoundError: Failed resolution of: Luts/sdk/modules/DCloudUniNetwork/RequestOptions;
at pages/index/index.uvue:28:3
 |     })
 |     */
 |     uni.request({
 |     ^^^^^^^^^^^^^
 |      url: 'https://www.baidu.com',
 |      method: 'GET',

以上这个测试项目已上传gitcode,

复现请按照以上步骤测试:https://gitcode.net/AaBbCclqx2020/Uniappx/-/tree/master/


更多关于uni-app x下导入、使用云对象报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app x下导入、使用云对象报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


uni-app x 中导入和使用云对象时,如果遇到报错,可能是由于多种原因引起的。以下是一些常见的排查步骤和解决方案:

1. 确保云对象已正确部署

首先,确保你的云对象已经正确部署到云端。你可以在 uniCloud 控制台中查看云对象的状态,确保它已经成功部署。

2. 检查云对象的路径

uni-app x 中,导入云对象时需要使用正确的路径。通常,云对象的路径格式如下:

const cloudObject = uniCloud.importObject('your-cloud-object-name');

确保 your-cloud-object-name 与你在 uniCloud 控制台中定义的云对象名称一致。

3. 检查云对象的权限

云对象的权限设置可能会影响其调用。确保云对象的权限设置允许客户端调用。你可以在 uniCloud 控制台中检查并调整云对象的权限。

4. 检查网络连接

确保你的设备或模拟器能够正常访问互联网,并且能够连接到 uniCloud 服务。网络问题可能导致云对象调用失败。

5. 查看错误日志

如果云对象调用失败,查看控制台或日志中的错误信息。错误信息通常会提供一些线索,帮助你定位问题。

6. 检查云对象的代码

确保云对象的代码没有错误。你可以在 uniCloud 控制台中直接测试云对象,确保它能够正常运行。

7. 检查 uni-app x 的版本

确保你使用的 uni-app x 版本是最新的,或者至少是支持云对象调用的版本。旧版本可能存在兼容性问题。

8. 示例代码

以下是一个简单的示例,展示如何在 uni-app x 中导入和使用云对象:

// 导入云对象
const cloudObject = uniCloud.importObject('your-cloud-object-name');

// 调用云对象的方法
cloudObject.yourMethodName({ param1: 'value1', param2: 'value2' })
  .then(res => {
    console.log('云对象调用成功:', res);
  })
  .catch(err => {
    console.error('云对象调用失败:', err);
  });
回到顶部