Skip to main content

按钮->业务修改

比如,我想通过点击某个按钮来触发,其他业务数据变更,如一个修改数据库的操作,该如何写?

要通过点击按钮来触发其他业务数据变更,例如修改数据库,可以在 set 函数中执行相应的操作。以下是一个扩展的示例,展示如何在按钮回调中进行数据库操作:

import { Bot } from "grammy";
import { MenuTemplate, MenuMiddleware } from "grammy-inline-menu";
import type { MyContext } from '../../my-context.js';
import { backButtons } from '../general.js';

// 模拟数据库操作函数
async function updateDatabase(userId: number, newValue: string): Promise<void> {
// 在这里实现你的数据库更新逻辑
console.log(`Updating database for user ${userId} with value ${newValue}`);
}

const bot = new Bot<MyContext>("<your-bot-token>");

// 创建菜单模板
const menu = new MenuTemplate<MyContext>((ctx) =>
ctx.t('settings-language')
);

// 添加选择按钮并处理回调
menu.select('lang', {
choices: {
en: "English",
es: "Español",
fr: "Français",
},
isSet: async (ctx, key) => await ctx.i18n.getLocale() === key,
async set(ctx, key) {
// 更新用户语言设置
await ctx.i18n.setLocale(key);

// 执行数据库更新操作
await updateDatabase(ctx.from.id, key);

return true; // 返回 true 表示选择成功
},
});

// 添加返回按钮
menu.manualRow(backButtons);

// 创建菜单中间件
const menuMiddleware = new MenuMiddleware('/', menu);

// 使用中间件
bot.use(menuMiddleware);

// 启动机器人
bot.start();

说明

  1. 数据库操作:定义一个 updateDatabase 函数来模拟数据库更新。在实际应用中,你可以替换为真实的数据库操作。
  2. 回调处理:在 set 函数中,除了更新语言设置外,还调用 updateDatabase 函数来处理数据变更。
  3. 上下文信息:使用 ctx.from.id 获取用户的 ID,以便在数据库中进行相应的更新。

确保根据你的实际需求和数据库结构调整 updateDatabase 函数的实现。