uni-app 定时触发云函数后数据库数据未更改

uni-app 定时触发云函数后数据库数据未更改

产品分类:

uniCloud/App

示例代码:

定时云函数配置

{
    "name": "timing",
    "dependencies": {},
    "extensions": {
        "uni-cloud-jql": {}
    },
    "main": "index.js",
    "cloudfunction-config": {
        "memorySize": 512,
        "timeout": 600,
        "runtime": "Nodejs12",
        "concurrency": 20,
        "triggers": [{
            "name": "myTrigger",
            "type": "timer",
            "config": "0 25 6,17,23 * * * *"
        }]
    }
}

定时云函数

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
    uniCloud.callFunction({
        name: 'projectinitiation',
        data: {}
    }).then((res) => {
        return res
        console.log(res);
    }).catch((errr) => {
        return errr
        console.log(errr);
    })  
};

定时云函数调用的云函数

'use strict';
const db = uniCloud.database()
exports.main = async (event, context) => {
    uniCloud.callFunction({
        name: 'mainproject',
        data: {
            mode: 'listAll',
            data: {
                projectStatus: 0
            }
        }
    }).then((res) => {
        let editId = []
        const timestamp = Date.now();
        res.result.data.forEach((item) => {
            if (item.start_time <= timestamp) {
                editId.push(item._id)
            }
        })
        uniCloud.callFunction({
            name: 'mainproject',
            data: {
                mode: 'modifyEachAll',
                data: {
                    id: editId,
                    data: {
                        projectStatus: 1
                    }
                }
            }
        }).then((ress) => {
            return ress
            // console.log(res)
        }).catch((errr) => {
            console.log(errr);
            return errr;
        })
    }).catch((errr) => {
        return errr
        console.log(errr);
    })
};

操作步骤:

  • 执行定时任务

预期结果:

  • 定时任务执行之后,数据库数据进行改变

实际结果:

  • 定时任务执行之后,数据库数据并没有发生改变

bug描述:

使用定时云函数 变更数据库数据,并不能变更数据库数据,但是在本地调用这个定时云函数,数据库的数据是可以变更的,日志里面显示定时器触发成功,数据并没有更改


更多关于uni-app 定时触发云函数后数据库数据未更改的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

在云端运行时,所有的请求都要加await的,包括数据库请求,都要加await,云端不支持回调的写法,只能用async + await

更多关于uni-app 定时触发云函数后数据库数据未更改的实战教程也可以访问 https://www.itying.com/category-93-b0.html


好吧,我试试

在使用 uni-app 开发时,如果你通过定时触发云函数操作数据库,但发现数据库数据未更改,可能是以下几个原因导致的。你可以根据以下步骤进行排查和解决问题:


1. 云函数是否成功触发

  • 检查云函数是否被定时任务成功触发:
    • 在云函数的入口处添加 console.log 日志,查看是否正常执行。
    • 在云开发控制台的日志中查看是否有相关输出。
  • 如果云函数未触发,检查定时任务的配置是否正确。

2. 云函数是否有权限操作数据库

  • 确保云函数有权限操作数据库:
    • 在云开发控制台中,检查云函数的权限设置,确保有读写数据库的权限。
    • 如果使用了自定义权限,确保配置正确。

3. 数据库操作代码是否正确

  • 检查云函数中操作数据库的代码是否正确:

    • 确保使用了正确的集合名称和字段名称。
    • 检查数据库操作是否成功,例如通过 db.collection('xxx').update()db.collection('xxx').set() 方法。
    • 在数据库操作后添加日志,查看是否成功执行。
    const db = uniCloud.database();
    const res = await db.collection('your_collection').where({ _id: 'your_id' }).update({
      field: 'new_value'
    });
    console.log('Update result:', res);
    

4. 定时任务的触发频率

  • 检查定时任务的触发频率是否合理:
    • 如果定时任务触发频率过高,可能会导致数据库操作未完成或触发失败。
    • 在云开发控制台中,检查定时任务的配置,确保触发频率符合预期。

5. 数据库数据是否满足条件

  • 检查数据库中的数据是否满足更新条件:
    • 如果使用了 where 条件,确保条件能够匹配到数据。
    • 例如,db.collection('xxx').where({ status: 1 }).update(...),如果 status 不为 1,则不会更新。

6. 网络或服务问题

  • 检查网络或云开发服务是否正常:
    • 如果云开发服务出现故障,可能会导致数据库操作失败。
    • 在云开发控制台中查看服务状态,或尝试手动触发云函数测试。

7. 异步操作是否正确处理

  • 确保异步操作已正确处理:

    • 如果使用了 async/awaitPromise,确保等待异步操作完成。
    • 例如:
    exports.main = async (event, context) => {
      const db = uniCloud.database();
      const res = await db.collection('your_collection').where({ _id: 'your_id' }).update({
        field: 'new_value'
      });
      return res;
    };
回到顶部