Guide

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')
Read more in unstorage.unjs.io.

配置

你可以使用 storage 配置挂载一个或多个自定义存储驱动器。 键是挂载点名称,值是驱动器名称和配置。

export default defineNitroConfig({
  storage: {
    redis: {
      driver: 'redis',
      /* redis 连接器选项 */
    },
    db: {
      driver: 'fs',
      base: './data/db'
    }
  }
})
你可以在 unstorage 文档 中找到驱动器列表及其配置。

运行时配置

在挂载点配置在运行时未知的场景中,Nitro 可以在启动时动态添加挂载点,使用 plugins

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 问题 这里

仅限开发的挂载点

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

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

// 访问项目 src 目录(默认与根相同)
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'
    }
  }
})

你还可以在开发期间仅在存储层中访问到一个 build 名称空间。它包含由 Nitro 生成的文件。