创建数据库适配器
学习如何使用 createAdapter
为 Better-Auth 创建自定义数据库适配器。
我们的 createAdapter
函数设计得非常灵活,我们尽力使其易于理解和使用。
我们的目标是让你专注于编写数据库逻辑,而不必担心适配器如何与 Better-Auth 配合工作。
从自定义模式配置、自定义 ID 生成、安全 JSON 解析等,一切都由 createAdapter
函数处理。
你只需提供数据库逻辑,createAdapter
函数将处理其余部分。
快速开始
适配器
adapter
函数是你编写与数据库交互代码的地方。
如果你还没有查看,请查看 config 部分 中的 options
对象,因为它对你的适配器可能很有用。
在我们深入了解适配器函数之前,让我们先了解一下可用的参数。
options
:Better Auth 选项。schema
:用户 Better Auth 实例的模式。debugLog
:调试日志函数。getField
:获取字段函数。getDefaultModelName
:获取默认模型名称函数。getDefaultFieldName
:获取默认字段名称函数。getFieldAttributes
:获取字段属性函数。
适配器方法
- 所有
model
值都已根据最终用户的模式配置转换为数据库的正确模型名称。- 这也意味着,如果你需要访问给定模型的
schema
版本,你不能使用这个精确的model
值,你需要使用选项中提供的getDefaultModelName
函数将model
转换为schema
版本。
- 这也意味着,如果你需要访问给定模型的
- 我们将根据用户的
schema
配置自动填充你返回的任何缺失字段。 - 任何包含
select
参数的方法,仅用于更高效地从数据库获取数据。你不需要担心只返回select
参数指定的内容,因为我们会为你处理这个问题。
create
方法
create
方法用于在数据库中创建新记录。
注意:
在所有情况下,id
字段会自动在 data
对象内生成,除非用户启用了 useNumberId
选项,或者在用户的 Better-Auth 配置中 generateId
为 false
。
在这些情况下,预期用户的数据库将处理 ID 生成。
参数:
model
:新数据将被插入的模型/表名。data
:要插入数据库的数据。
确保返回插入到数据库中的数据。
update
方法
update
方法用于更新数据库中的记录。
参数:
model
:记录将被更新的模型/表名。where
:用于更新记录的where
子句。update
:用于更新记录的数据。
确保返回更新的行中的数据。这包括任何未更新的字段。
updateMany
方法
updateMany
方法用于更新数据库中的多条记录。
参数:
model
:记录将被更新的模型/表名。where
:用于更新记录的where
子句。update
:用于更新记录的数据。
delete
方法
delete
方法用于从数据库中删除记录。
参数:
model
:记录将被删除的模型/表名。where
:用于删除记录的where
子句。
deleteMany
方法
deleteMany
方法用于从数据库中删除多条记录。
参数:
model
:记录将被删除的模型/表名。where
:用于删除记录的where
子句。
findOne
方法
findOne
方法用于在数据库中查找单条记录。
参数:
model
:记录将被查找的模型/表名。where
:用于查找记录的where
子句。select
:要返回的select
子句。
findMany
方法
findMany
方法用于在数据库中查找多条记录。
参数:
model
:记录将被查找的模型/表名。where
:用于查找记录的where
子句。limit
:要返回的记录限制。sortBy
:用于对记录进行排序的sortBy
子句。offset
:要返回的记录偏移量。
确保返回在数据库中找到的数据数组。
count
方法
count
方法用于计算数据库中的记录数。
参数:
model
:记录将被计数的模型/表名。where
:用于计数记录的where
子句。
options
(可选)
options
对象用于你从自定义适配器选项获取的任何潜在配置。
createSchema
(可选)
createSchema
方法允许 Better Auth CLI 生成 数据库的模式。
参数:
tables
:用户 Better-Auth 实例模式中的表格,预期将生成到模式文件中。file
:用户可能已传递给generate
命令的文件,作为预期的模式文件输出路径。
测试你的适配器
我们提供了一个测试套件,你可以用它来测试你的适配器。它需要你使用 vitest
。
数字 ID 测试
如果你的数据库支持数字 ID,那么你也应该运行这个测试:
配置
config
对象用于向 Better-Auth 提供关于适配器的信息。
我们强烈建议你阅读下面提供的每个选项,因为这将帮助你理解如何正确配置你的适配器。
必需配置
adapterId
适配器的唯一标识符。
adapterName
适配器的名称。
可选配置
supportsNumericIds
数据库是否支持数字 ID。如果设置为 false
并且用户配置启用了 useNumberId
,那么我们将抛出一个错误。
supportsJSON
数据库是否支持 JSON。如果数据库不支持 JSON,我们将使用 string
来保存 JSON 数据。当我们检索数据时,我们将安全地将 string
解析回 JSON 对象。
supportsDates
数据库是否支持日期。如果数据库不支持日期,我们将使用 string
来保存日期。(ISO 字符串)当我们检索数据时,我们将安全地将 string
解析回 Date
对象。
supportsBooleans
数据库是否支持布尔值。如果数据库不支持布尔值,我们将使用 0
或 1
来保存布尔值。当我们检索数据时,我们将安全地将 0
或 1
解析回布尔值。
usePlural
模式中的表名是否为复数形式。这通常由用户定义,并通过你的自定义适配器选项传递。如果你不打算允许用户自定义表名,你可以忽略此选项,或将其设置为 false
。
debugLogs
用于启用适配器的调试日志。你可以传入一个布尔值,或一个具有以下键的对象:create
、update
、updateMany
、findOne
、findMany
、delete
、deleteMany
、count
。
如果任何键为 true
,则该方法的调试日志将被启用。
disableIdGeneration
是否禁用 ID 生成。如果设置为 true
,则用户的 generateId
选项将被忽略。
customIdGenerator
如果你的数据库只支持特定的自定义 ID 生成,那么你可以使用此选项生成你自己的 ID。
mapKeysTransformInput
如果你的数据库在特定情况下使用不同的键名,你可以使用此选项映射键。这对于期望在特定情况下使用不同键名的数据库很有用。
例如,MongoDB 使用 _id
,而在 Better-Auth 中我们使用 id
。
返回对象中的每个键代表要替换的旧键。 值代表新键。
这可以是一个只转换一些键的部分对象。
mapKeysTransformOutput
如果你的数据库在特定情况下使用不同的键名,你可以使用此选项映射键。这对于在特定情况下使用不同键名的数据库很有用。
例如,MongoDB 使用 _id
,而在 Better-Auth 中我们使用 id
。
返回对象中的每个键代表要替换的旧键。 值代表新键。
这可以是一个只转换一些键的部分对象。
customTransformInput
如果你需要在数据保存到数据库之前转换输入数据,你可以使用此选项转换数据。
如果你使用 supportsJSON
、supportsDates
或 supportsBooleans
,那么
转换将在调用你的 customTransformInput
函数之前应用。
customTransformInput
函数接收以下参数:
data
:要转换的数据。field
:正在转换的字段。fieldAttributes
:正在转换的字段的字段属性。select
:查询期望返回的select
值。model
:正在转换的模型。schema
:正在转换的模式。options
:Better Auth 选项。
customTransformInput
函数在给定操作的数据对象的每个键上运行。
customTransformOutput
如果你需要在输出数据返回给用户之前转换输出数据,你可以使用此选项转换数据。customTransformOutput
函数用于转换输出数据。
与 customTransformInput
函数类似,它在给定操作的数据对象的每个键上运行,但它在从数据库检索数据后运行。