@raypx/storage
基于 unstorage 的对象存储抽象。
@raypx/storage 基于 unstorage 提供统一的键值存储抽象,支持本地文件系统和 Redis 两种驱动。
createStorage()
工厂函数,根据配置创建存储实例。
import { createStorage } from "@raypx/storage"
const storage = createStorage()选项
interface StorageFactoryOptions {
driver?: "local" | "redis"
local?: {
rootDir?: string
}
redis?: {
url?: string
base?: string
ttl?: number
}
}不传参数时,驱动和配置从环境变量中读取。
API
存储实例提供以下方法:
putObject()
写入对象。
await storage.putObject({
key: "uploads/avatar.png",
body: Buffer.from(fileData),
})
await storage.putObject({
key: "data/config.json",
body: JSON.stringify(config),
})| 参数 | 类型 | 说明 |
|---|---|---|
key | string | 对象键名 |
body | Uint8Array | Buffer | string | 对象内容 |
getObject()
读取对象。对象不存在时抛出错误。
const result = await storage.getObject("uploads/avatar.png")
// result.key: string
// result.body: BuffercreateSignedUploadUrl()
生成上传 URL(仅本地驱动支持)。
const result = await storage.createSignedUploadUrl({
key: "uploads/avatar.png",
contentType: "image/png",
})
// result.url: "/api/files/upload?key=uploads%2Favatar.png"
// result.method: "PUT"
// result.headers: { "content-type": "image/png" }驱动
local(默认)
使用 fs-lite 驱动,将文件存储在本地文件系统中。
const storage = createStorage({ driver: "local" })redis
使用 Redis 驱动,支持 TTL 过期。Redis 驱动通过动态 import() 加载,仅在需要时引入依赖。
const storage = createStorage({
driver: "redis",
redis: {
url: "redis://localhost:6379",
base: "raypx:storage",
ttl: 3600,
},
})环境变量
| 变量 | 类型 | 默认值 | 说明 |
|---|---|---|---|
STORAGE_DRIVER | "local" | "redis" | "local" | 存储驱动 |
STORAGE_LOCAL_ROOT | string | .storage | 本地存储根目录 |
STORAGE_REDIS_URL | url | - | Redis 连接 URL |
STORAGE_REDIS_BASE | string | - | Redis 键前缀 |
STORAGE_REDIS_TTL_SECONDS | number | - | 键过期时间(秒) |
类型导出
import type {
Storage,
StorageDriver,
StorageFactoryOptions,
PutObjectInput,
PutObjectResult,
GetObjectResult,
CreateSignedUploadUrlInput,
CreateSignedUploadUrlResult,
} from "@raypx/storage"