跳到内容
+

自定义函数

它们提供了一种将现有函数快速引入 Toolpad Studio 页面的方法。

将数据引入 Toolpad Studio 最强大的方式是通过您自己的代码。您可以在 toolpad/resources 内部定义函数,并在创建此类型的查询时使用它们。以下视频展示了如何使用此功能从 PostgreSQL 读取数据。

函数编辑器

  • 函数

    这对应于您在文件系统上 toolpad/resources 文件夹内创建的函数。例如,toolpad/resources/functions.ts 中的默认函数如下所示

    export default async function handler(message: string) {
      return `Hello ${message}`;
    }
    
  • Toolpad Studio 自定义函数完全在 Node 服务器端运行。例如,如果您将上述示例的内容更改为
    export async function example() {
      return process.versions;
    }
    

    您将获得以下响应

Server-side values

在自定义函数中使用服务器端值

  • 您可以在自定义函数中导入和使用任何 Node 模块。

参数

为了真正有用,您需要将这些查询与页面上存在的数据连接起来。您可以通过创建参数来实现。

所有函数参数都将在查询编辑器中可用,以绑定状态。请确保使用 TypeScript 类型正确注释它们。Toolpad Studio 使用此信息为您呈现正确类型的数据绑定控件。例如

export async function getAnimals(
  species: 'cat' | 'dog' | 'rabbit',
  name: string,
  minAge: number,
) {
  return db.queryAnimals({
    species,
    name,
    age: { min: minAge },
  });
}
Controls for custom function parameters

自定义函数参数的控件

密钥处理

Toolpad Studio 可以访问在项目根目录的 .env 文件中定义的环境变量。

您甚至可以在定义自定义函数时直接使用环境变量,就像您通常编写后端代码时一样。例如

OPENAI_API_KEY=...

然后您可以像这样在自定义函数中使用它们

import { Configuration, OpenAIApi } from 'openai';

export async function askGPT(messages: string[]) {
  const configuration = new Configuration({
    apiKey: process.env.OPENAI_API_KEY,
  });

  const openai = new OpenAIApi(configuration);
  const completion = await openai.createChatCompletion({
    model: 'gpt-3.5-turbo',
    messages: messages,
  });

  const response = completion.data?.choices[0].message ?? {
    role: 'assistant',
    content: 'No response',
  };

  return response;
}

然后您可以在页面上使用此函数

Custom function with secret

使用带有环境变量的自定义函数

请求上下文

当您在经过身份验证的上下文中运行 Toolpad Studio 时,能够访问后端函数中的身份验证信息可能很有用。为此,我们提供了 getContext API,允许您检查启动后端函数的请求的 Cookie。

使用 context.cookies 访问 Cookie

import { getContext } from '@toolpad/studio/server';
import { parseAuth } from '../../src/lib/auth';

export async function myBackendFunction() {
  const ctx = getContext();
  const user = await parseAuth(ctx.cookie.authentication);
  return user?.id;
}

使用 context.setCookie 写入 Cookie

您还可以使用上下文来设置 Cookie,随后可以在从 Toolpad Studio 应用程序调用的其他后端函数中使用该 Cookie。示例

import { getContext } from '@toolpad/studio/server';
import * as api from './myApi';

const MY_COOKIE_NAME = 'MY_AUTH_TOKEN';

export async function login(user: string, password: string) {
  const token = await api.login(user, password);
  const { setCookie } = getContext();
  setCookie(MY_COOKIE_NAME, token);
}

export async function getData() {
  const { cookies } = getContext();
  const token = cookies[MY_COOKIE_NAME];
  return api.getData(token);
}

使用 context.session 获取当前已验证的会话

如果您的 Toolpad Studio 应用程序启用了身份验证,您可以从已验证的会话中获取数据,例如登录用户的 emailnameavatar。示例

import { getContext } from '@toolpad/studio/server';

export async function getCurrentUserEmail() {
  const { session } = getContext();
  return session?.user.email;
}