uni-app clinetDB频发报错语法或逻辑异常

发布于 1周前 作者 ionicwang 来自 Uni-App

uni-app clinetDB频发报错语法或逻辑异常

操作步骤:

见bug描述

预期结果:

见bug描述

实际结果:

见bug描述

bug描述:

报错信息如下

{"errMsg":"[DCloud-clientDB]: 用户函数代码语法或逻辑异常","errCode":"SYS_ERR","code":"SYS_ERR","requestId":"xxx"}

无法稳定复现,任意clientDB操作都有可能出现,同一个操作提交第一次报错可能第二次就不报错,不知道如何获取更详细的报错信息,后台日志clientDB相关全空完全没法排查。

7 回复

查询语句及查询失败日志发一下。


一个单纯的只有3条数据的表,read权限是true,查询语句是uniCloud.database().collection(‘test’).get(),前面onerror返回的报错如上文,后台clientDB相关日志对应request下一片空白,只能看到执行失败

dev模式没有问题,build模式就有,我看网络是invokeFunction返回了500

回复 l***@qq.com: 再次出现把500错误的请求的响应头和响应体发给我。

回复 DCloud_uniCloud_CRL: 我看了下报错响应体,似乎是找不到redis,我之前短暂开通了redis发现和我预想的功能不一样又选择删除了redis空间,现在我在后台点进redis会显示“Business Failed, 业务异常. traceId: 0b26dfec17313276824097637e9840”,请问怎么处理呢?

回复 l***@qq.com: 在uniCloud控制台报障反馈一下这个问题。

在处理 uni-app 中的 clientDB 频发的语法或逻辑异常时,通常涉及到数据库操作的不当使用。uni-app 提供了基于 SQLite 的本地数据库操作接口,如果代码中存在语法错误或逻辑问题,就可能导致异常。以下是一些常见的错误场景及其修正代码示例:

1. SQL 语法错误

错误的 SQL 语句是导致数据库操作失败的一个常见原因。例如,插入数据时字段名或数据类型不匹配。

错误示例

uni.cloud.database().collection('users').add({
    data: {
        username: 'testUser',
        age: 'twenty-five'  // 错误:age 应为数字
    }
}).then(res => {
    console.log(res);
}).catch(err => {
    console.error(err);
});

修正示例

uni.cloud.database().collection('users').add({
    data: {
        username: 'testUser',
        age: 25  // 正确:age 为数字
    }
}).then(res => {
    console.log(res);
}).catch(err => {
    console.error(err);
});

注意:上述示例使用的是云数据库,本地数据库操作类似,需确保 SQL 语句正确。

2. 逻辑处理不当

在数据库操作中,如果逻辑处理不当,也可能导致异常。例如,尝试查询一个不存在的集合。

错误示例

const db = uni.getDatabase();
db.collection('nonExistentCollection').get().then(res => {
    console.log(res);
}).catch(err => {
    console.error(err);
});

修正示例: 确保集合名正确,或在进行操作前检查集合是否存在。

const db = uni.getDatabase();
const collectionName = 'users';  // 确保集合名正确
db.collection(collectionName).get().then(res => {
    console.log(res);
}).catch(err => {
    console.error('Error accessing collection:', err);
});

3. 异步处理不当

数据库操作通常是异步的,如果处理不当,可能会导致逻辑上的错误。

错误示例

let user;
uni.cloud.database().collection('users').doc('some-id').get().then(res => {
    user = res.data;
});
console.log(user);  // 可能为 undefined,因为异步操作未完成

修正示例: 确保在异步操作完成后处理数据。

uni.cloud.database().collection('users').doc('some-id').get().then(res => {
    let user = res.data;
    console.log(user);
}).catch(err => {
    console.error(err);
});

通过仔细检查 SQL 语句、逻辑处理以及异步操作,可以有效减少 uni-appclientDB 的语法或逻辑异常。

回到顶部