KV 存储
Nitro 提供了一个内置的存储层,可以抽象文件系统、数据库或任何其他数据源。
Nitro 内置集成了 unjs/unstorage,以提供与运行时无关的持久层。
用法
要使用存储层,您可以使用 useStorage() 并调用 getItem(key) 来检索项,以及 setItem(key, value) 来设置项。
// 默认存储在内存中
await useStorage().setItem('test:foo', { hello: 'world' })
await useStorage().getItem('test:foo')
// 您也可以在 useStorage(base) 中指定基础路径
await useStorage('test').setItem('foo', { hello: 'world' })
// 您可以使用数据存储将数据写入默认的 .data/kv 目录
const dataStorage = useStorage('data')
await dataStorage.setItem('test', 'works')
await dataStorage.getItem('data:test') // 值持久化
// 您可以使用泛型定义类型
await useStorage<{ hello: string }>('test').getItem('foo')
await useStorage('test').getItem<{ hello: string }>('foo')
配置
您可以使用 storage 配置挂载一个或多个自定义存储驱动程序。键 是挂载点名称,值 是驱动程序名称和配置。
export default defineNitroConfig({
storage: {
redis: {
driver: 'redis',
/* redis 连接器选项 */
},
db: {
driver: 'fs',
base: './data/db'
}
}
})
export default defineNuxtConfig({
nitro: {
storage: {
redis: {
driver: 'redis',
/* redis connector options */
},
db: {
driver: 'fs',
base: './.data/db'
}
}
}
})
运行时配置
在直到运行时才知道挂载点配置的场景中,Nitro 可以在启动时使用 插件 动态添加挂载点。
import redisDriver from 'unstorage/drivers/redis'
export default defineNitroPlugin(() => {
const storage = useStorage()
// 从运行时配置或其他来源动态传入凭据
const driver = redisDriver({
base: 'redis',
host: useRuntimeConfig().redis.host,
port: useRuntimeConfig().redis.port,
/* 其他 redis 连接器选项 */
})
// 挂载驱动程序
storage.mount('redis', driver)
})
export default defineNitroConfig({
runtimeConfig: {
redis: { // Default values
host: '',
port: 0,
/* other redis connector options */
}
}
})
export default defineNuxtConfig({
runtimeConfig: {
redis: { // Default values
host: '',
port: 0,
/* other redis connector options */
}
}
})
这是一个临时解决方案,未来将有更好的解决方案!请关注 GitHub 上的此问题:这里。
仅开发环境挂载点
默认情况下,Nitro 在开发时会使用文件系统驱动程序挂载项目目录和一些其他目录。
// 访问项目根目录
const rootStorage = useStorage('root')
// 访问项目 src 目录(默认与 root 相同)
const srcStorage = useStorage('src')
// 访问服务器缓存目录
const cacheStorage = useStorage('cache')
// 访问临时构建目录
const buildStorage = useStorage('build')
您还可以使用
devStorage 键在开发期间覆盖存储配置。当您在生产环境中使用数据库,而在开发环境中使用文件系统时,这非常有用。要使用 devStorage 键,您需要使用 nitro dev 命令,并且 storage 选项中的键必须与生产环境中的键相同。
export default defineNitroConfig({
// 生产环境
storage: {
db: {
driver: 'redis',
/* redis 连接器选项 */
}
},
// 开发环境
devStorage: {
db: {
driver: 'fs',
base: './data/db'
}
}
})
export default defineNuxtConfig({
nitro: {
// Production
storage: {
db: {
driver: 'redis',
/* redis connector options */
}
},
// Development
devStorage: {
db: {
driver: 'fs',
base: './data/db'
}
}
}
})
在开发期间,您还可以在存储层中访问一个 build 命名空间。它包含由 Nitro 生成的文件。