跳到主要内容

BFF API


BFF API 参考

v1.3.0+

BFF (Backend For Frontend) API 允许你调用在 Lovrabet 平台上配置的后端函数。

ℹ️ 版本要求此功能从 SDK v1.3.0 版本开始支持。

什么时候使用 BFF API?

场景

推荐 API

简单的 CRUD 操作

Dataset API

自定义 SQL 查询

SQL API

复杂业务逻辑计算

BFF API

需要后端处理的操作

BFF API

API 方法

execute()

调用后端函数。

方法签名

client.bff.execute<T>({ scriptName, params, options }: BffExecuteParams): Promise<T>

参数

参数

类型

必填

说明

scriptName

string

后端函数名称

params

Record<string, any>

函数参数

options

BffOptions

执行选项

返回值

直接返回业务数据(已在 SDK 中从 data 字段提取)。

💡 与 SQL API 的区别

快速开始

基础调用

import { createClient } from "@lovrabet/sdk";

const client = createClient({
accessKey: process.env.LOVRABET_ACCESS_KEY,
appCode: "your-app-code",
});

// 调用后端函数
const result = await client.bff.execute({
scriptName: 'getUserDashboard'
});

console.log("用户数据:", result);

带参数调用

const price = await client.bff.execute({
scriptName: 'calculatePrice',
params: {
productId: '123',
quantity: 10,
userLevel: 'VIP'
}
});

console.log("计算结果:", price);

TypeScript 类型支持

// 定义返回类型
interface PriceResult {
originalPrice: number;
discountedPrice: number;
discount: number;
finalPrice: number;
}

// 使用泛型
const price = await client.bff.execute<PriceResult>({
scriptName: 'calculatePrice',
params: { productId: '123', quantity: 10 }
});

console.log(`原价: ${price.originalPrice}`);
console.log(`折扣: ${price.discount}`);
console.log(`最终价格: ${price.finalPrice}`);

常见使用场景

场景一:价格计算

interface CalculatePriceParams {
productId: string;
quantity: number;
couponCode?: string;
}

interface PriceResult {
unitPrice: number;
subtotal: number;
discount: number;
total: number;
}

async function calculatePrice(params: CalculatePriceParams): Promise<PriceResult> {
return await client.bff.execute<PriceResult>({
scriptName: 'calculateOrderPrice',
params
});
}

// 使用
const price = await calculatePrice({
productId: 'prod-001',
quantity: 5,
couponCode: 'SUMMER2024'
});

场景二:数据聚合

interface DashboardStats {
userCount: number;
orderCount: number;
revenue: number;
topProducts: Array<{ name: string; sales: number }>;
}

async function getDashboardStats(timeRange: string): Promise<DashboardStats> {
return await client.bff.execute<DashboardStats>({
scriptName: 'getDashboardStats',
params: { timeRange }
});
}

const stats = await getDashboardStats('last7days');
console.log(`总收入: ${stats.revenue}`);

场景三:复杂业务逻辑

// 处理订单逻辑(库存检查、价格计算、优惠券应用等)
interface OrderResult {
success: boolean;
orderId?: string;
message?: string;
}

async function createOrder(items: Array<{productId: string; quantity: number}>) {
return await client.bff.execute<OrderResult>({
scriptName: 'processOrder',
params: { items }
});
}

const result = await createOrder([
{ productId: 'p1', quantity: 2 },
{ productId: 'p2', quantity: 1 }
]);

if (result.success) {
console.log(`订单创建成功: ${result.orderId}`);
} else {
console.error(`订单创建失败: ${result.message}`);
}

错误处理

使用 safe 函数

import { safe } from "@lovrabet/sdk";

const { data: result, error } = await safe(() =>
client.bff.execute({
scriptName: 'calculatePrice',
params: { productId: '123', quantity: 10 }
})
);

if (error) {
console.error("调用失败:", error.message, error.description);
return;
}

console.log("计算结果:", result);

使用 try-catch

import { LovrabetError } from "@lovrabet/sdk";

try {
const result = await client.bff.execute({
scriptName: 'calculatePrice',
params: { productId: '123', quantity: 10 }
});

console.log("计算结果:", result);
} catch (error) {
if (error instanceof LovrabetError) {
if (error.status === 404) {
console.error("后端函数不存在");
} else if (error.status === 500) {
console.error("后端执行错误");
} else {
console.error("请求失败:", error.message);
}
}
}

常见问题

BFF API 和 SQL API 的区别?

特性

SQL API

BFF API

用途

数据查询

业务逻辑处理

返回格式

{ execSuccess, execResult }

直接返回业务数据

参数化

支持 #{param}

支持 JSON 参数

适用场景

查询、统计

计算、工作流

如何调试 BFF 调用?

启用调试模式:

const client = createClient({
appCode: "your-app",
accessKey: process.env.ACCESS_KEY,
options: {
debug: true,
},
});

后端函数找不到?

检查:

  1. scriptName 是否与平台上配置的函数名完全一致

  2. 函数是否已发布

  3. appCode 是否有访问该函数的权限

相关文档

  • SQL API 使用指南 - 自定义 SQL 查询

  • API 使用指南 - Dataset API

  • 高级功能 - 更多高级特性