存储 KV Storage

Nitro 提供了一个内置存储层,可以抽象文件系统、数据库或任何其他数据源。

Nitro 内置与 unjs/unstorage 的集成,以提供与运行时无关的持久层。

Usage

要使用存储层,您可以使用 useStorage() 并调用 getItem(key) 来检索项目,以及 setItem(key, value) 来设置项目。

ts
// 默认存储在内存中
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').setItem('test', 'works')
await useStorage().getItem('data:test') // 值保持不变

// 您可以使用泛型来定义类型
await useStorage<{ hello: string }>('test').getItem('foo')
await useStorage('test').getItem<{ hello: string }>('foo')

Configuration

您可以使用“存储”配置挂载一个或多个自定义存储驱动程序。 键是挂载点名称,值是驱动程序名称和配置。

ts
nitro.config.ts
ts
export default defineNitroConfig({
  storage: {
    redis: {
      driver: 'redis',
      /* redis 连接器选项 */
    },
    db: {
      driver: 'fs',
      base: './data/db'
    }
  }
})

您可以在 unstorage 文档中找到驱动程序列表及其配置。

Runtime configuration

在直到运行时才知道挂载点配置的情况下,Nitro 可以在启动期间使用 插件 动态添加挂载点。

ts
plugins/storage.ts
ts
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)
})

这只是暂时的解决方法,将来会有更好的解决方案!请留意此处的 GitHub 问题(https://github.com/unjs/nitro/issues/1161#issuecomment-1511444675)。

Development-only mount points

默认情况下,Nitro 将在开发时使用文件系统驱动程序挂载项目目录和一些其他目录。

js
// 访问项目根目录
const rootStorage = useStorage('root')

// 访问项目源目录(默认与根目录相同)
const srcStorage = useStorage('src')

// 访问服务器缓存目录
const cacheStorage = useStorage('cache')

// 访问临时构建目录
const buildStorage = useStorage('build')

您还可以使用 devStorage 键在开发期间覆盖存储配置。当您在生产中使用数据库并希望在开发中使用文件系统时,这非常有用。

为了使用 devStorage 键,您需要使用 nitro dev 命令,并且 storage 选项中的键必须与生产键相同。

ts
nitro.config.ts
ts
export default defineNitroConfig({
  // 生产
  storage: {
    db: {
      driver: 'redis',
      /* redis 连接器选项 */
    }
  },
  // 开发
  devStorage: {
    db: {
      driver: 'fs',
      base: './data/db'
    }
  }
})

您还将能够仅在开发期间访问存储层中的build命名空间。它包含由 Nitro 生成的文件。