uni-app 云函数定时器触发执行多次的问题

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

uni-app 云函数定时器触发执行多次的问题

操作步骤:

  • 看上面

预期结果:

  • 看上面

实际结果:

  • 看上面

bug描述:

云函数定时器触发,我设置的是每天早上7点执行,前几天都是正常的,每天早上7点执行一次。今天突然执行了两次,这是一个BUG。下面有截图。

想加qq群咨询被拒,只能来这问,qq群有位置为什么管理员不让进,付费用户也没地方咨询吗?

Screenshot Screenshot


1 回复

针对uni-app云函数定时器触发执行多次的问题,这通常是由于云函数被多次触发或者定时器设置不当导致的。以下是一个使用云开发定时触发器(Cloud Scheduler)来避免这种情况的示例代码,以及如何确保定时器只触发一次云函数的实现。

云函数代码示例(Node.js)

首先,确保你的云函数入口文件(通常是index.js)正确设置并导出了云函数处理逻辑。以下是一个简单的示例,该云函数每隔一段时间执行一次特定任务:

// 云函数入口文件 index.js
const cloud = require('wx-server-sdk');
cloud.init();
const db = cloud.database();

exports.main = async (event, context) => {
    try {
        // 这里放置你的业务逻辑
        console.log('云函数被触发');
        // 例如,更新数据库中的某个字段
        await db.collection('your_collection_name').doc('your_doc_id').update({
            data: {
                someField: 'newValue'
            }
        });
        return {
            success: true,
            message: '云函数执行成功'
        };
    } catch (error) {
        console.error('云函数执行出错', error);
        return {
            success: false,
            message: '云函数执行出错',
            error: error.message
        };
    }
};

设置云开发定时触发器

在腾讯云控制台中,为你的云函数设置一个定时触发器。确保定时触发器的配置正确,避免重复触发。

防止多次触发策略

  1. 确保定时器唯一性:在云函数中,可以维护一个状态标记(如数据库记录),每次触发云函数时检查该标记。如果标记显示正在执行,则直接返回,避免重复执行。

  2. 使用分布式锁:在复杂的场景下,可以考虑使用分布式锁(如Redis锁)来确保同一时间只有一个实例在执行。

示例:使用数据库状态标记防止重复触发

// 在云函数中检查状态标记
const lockCollection = db.collection('lock');
const lockDocId = 'unique_lock_id'; // 唯一的锁文档ID

exports.main = async (event, context) => {
    let lock = await lockCollection.doc(lockDocId).get();
    if (lock.data && lock.data.locked) {
        console.log('云函数正在执行中,本次触发忽略');
        return;
    }

    // 设置锁状态
    await lockCollection.doc(lockDocId).update({
        data: {
            locked: true
        }
    });

    try {
        // 业务逻辑
        // ...

        // 清除锁状态
        await lockCollection.doc(lockDocId).update({
            data: {
                locked: false
            }
        });
    } catch (error) {
        // 错误处理
        // ...
        // 确保错误发生时也清除锁状态
        await lockCollection.doc(lockDocId).update({
            data: {
                locked: false
            }
        });
    }
};

以上代码展示了如何通过数据库状态标记来防止云函数被定时触发器多次执行。根据实际需求,你可以调整和优化这些策略。

回到顶部