在nodejs中使用azure函数时间触发器更新表中的记录

问题描述 投票:0回答:1

我想更新 SQL Server 表中的记录。 查询如下所示:

UPDATE TutorAds
SET Status = 'expired', Published_At = NULL
WHERE Published_At < DATEADD(DAY, -7, GETDATE())

但是我找不到1天后更新记录的好例子。

我正在遵循此 Microsoft 指南

以前我曾尝试这样做,但它仅在我本地运行该函数时更新表记录。部署后,不会更改数据库。

这是我在 VSCODE 中的函数代码:

const { app } = require('@azure/functions');
const { Connection, Request } = require('tedious');
require('dotenv').config();

app.timer('newtriggerexpre', {
    schedule: '0 */2 * * * *',
    handler: (myTimer, context) => {
        const config = {
            "server": process.env.SQL_SERVER,
            "authentication": {
                "type": "default",
                "options": {
                    "userName": process.env.SQL_USERNAME,
                    "password": process.env.SQL_PASSWORD
                }
            },
            "options": {
                "port": 1433,
                "database": "Tutoringacademy",
                "trustServerCertificate": true
            }
        }

        const connection = new Connection(config);

        // Connect to SQL Server
        connection.on('connect', async function (err) {
            if (err) {
                context.log.error(err);
                return;
            }

            try {
                // Calculate the date 7 days ago
                const sevenDaysAgo = new Date();
                sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);

                // Execute update query for records older than 7 days
                const request = new Request(`
                UPDATE TutorAds
                SET Status = 'expired', Published_At = NULL
                WHERE Published_At < DATEADD(DAY, -7, GETDATE())
                `, function (err, rowCount) {
                    if (err) {
                        context.log.error(err);
                        return;
                    }

                    context.log(`${rowCount} rows were updated`);
                });

                request.addParameter('sevenDaysAgo', TYPES.DateTime, sevenDaysAgo);

                connection.execSql(request);
            } catch (err) {
                context.log.error(err);
            }
        });
    }
});


node.js azure azure-functions azure-sql-database
1个回答
0
投票

您正在尝试向请求添加参数 (

sevenDaysAgo
),但您没有在查询中使用它。您在查询中直接使用
DATEADD(DAY, -7, GETDATE())
而不是参数。

这里是带有定时器触发功能的上述参数的更新代码。

代码:

const { app } = require('@azure/functions');
const { Connection, Request, TYPES } = require('tedious');
require('dotenv').config();

app.timer('newtriggerexpre', {
    schedule: '0 */2 * * * *',
    handler: async (myTimer, context) => {
        const config = {
            "server": process.env.SQL_SERVER,
            "authentication": {
                "type": "default",
                "options": {
                    "userName": process.env.SQL_USERNAME,
                    "password": process.env.SQL_PASSWORD
                }
            },
            "options": {
                "port": 1433,
                "database": "Tutoringacademy",
                "trustServerCertificate": true
            }
        }
        
        const connection = new Connection(config);
        connection.on('connect', async function (err) {
            if (err) {
                context.log.error(err);
                return;
            }

            try {
                const sevenDaysAgo = new Date();
                sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7);
                const request = new Request(`
                UPDATE TutorAds
                SET Status = 'expired', Published_At = NULL
                WHERE Published_At < @sevenDaysAgo
                `, function (err, rowCount) {
                    if (err) {
                        context.log.error(err);
                        return;
                    }
                    context.log(`${rowCount} rows were updated`);
                    connection.close(); 
                });
                request.addParameter('sevenDaysAgo', TYPES.DateTime, sevenDaysAgo);
                connection.execSql(request);
            } catch (err) {
                context.log.error(err);
            }
        });
    }
});

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "storage_connec",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "AzureWebJobsFeatureFlags": "EnableWorkerIndexing",
    "SQL_SERVER": "<server_name>.database.windows.net",
    "SQL_USERNAME": "<user_name>",
    "SQL_PASSWORD": "<password>"
  }
}

输出:

定时器触发功能成功运行如下,

enter image description here

确保您的 Azure Function 已正确部署,并且环境变量 SQL_SERVERSQL_USERNAMESQL_PASSWORD 如下所示,

enter image description here

Azure 门户:

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.