@beignet/ 提供者- 存储- 本地
运行时间 : Beignet需要Node.js 22.12或更新. Bun是可选的.
[叹息] Beignet是实验性的α软件. 这个
0.0.x包行为早期 评估,且在框架结算时,API可能在发布之间发生变化.
Beignet 的本地文件系统存储提供商.
提供者安装了应用程序配置 ctx.ports.storage 端口 。 用它来
本地开发、需要耐用文件的测试和小型部署
文件系统支持的对象存储已足够.
createLocalStorageProvider(...) 返回稳定 LocalStorageProvider
类型. LocalStorageConfig 描述其有效的配置; Zod 方案
仍为内部.
安装
bun add @beignet/provider-storage-local @beignet/core
提供者设置
import { createLocalStorageProvider } from "@beignet/provider-storage-local";
import { createServer } from "@beignet/core/server";
const server = await createServer({
ports: basePorts,
providers: [createLocalStorageProvider()],
context: ({ ports }) => ({ ports }),
routes,
});
环境变量:
| 变量 | 说明 |
|---|---|
STORAGE_ROOT | 写入对象的目录 。 默认为 storage/app。 。 。 . |
STORAGE_PUBLIC_BASE_URL | 可选基址返回 publicUrl(...) 对于公共物体. |
beignet doctor --strict 检查安装的本地存储提供者是
登记在册 server/providers.ts。 。 。 .
STORAGE_PUBLIC_BASE_URL 可能是一个绝对的 URL,例如
https://assets.example.com 或相关路径,例如 /storage。 。 。 .
提供者只返回 URL 。 如果您在 Next.js 中使用了相适应路径
应用程序,为公共对象服务 createStorageRoute数字 :
// app/storage/[...key]/route.ts
import { createStorageRoute } from "@beignet/next";
import { getServer } from "@/server";
export const { GET, HEAD } = createStorageRoute(
async () => (await getServer()).ports.storage,
{
basePath: "/storage",
},
);
直接港口工厂
import { createLocalStorage } from "@beignet/provider-storage-local";
const storage = createLocalStorage({
root: "storage/app",
publicBaseUrl: "/storage",
});
提供者提供 ctx.ports.storage,标准贝格网
StoragePort。它没有特定供应商的逃生舱;使用端口
阅读、写作、公共URL和元数据.
一样 StoragePort 与本地文件、内存测试和云对象合作
存储 :
await ctx.ports.storage.put("avatars/user_123.png", avatarBytes, {
contentType: "image/png",
visibility: "public",
});
const object = await ctx.ports.storage.get("avatars/user_123.png");
const url = await ctx.ports.storage.publicUrl("avatars/user_123.png");
私人下载
将私有文件存储于 visibility: "private"在经过认证的应用路径中,
解析并授权文件记录,然后调用
createStorageDownloadResponse({ storage, key, fileName }) 从 @beignet/web
或者说 @beignet/next。它流出一个不可取用的附件并返回 null
当对象缺失时,所以路由可以使用其应用错误目录.
storage.temporaryUrl(key, { expiresInSeconds, fileName? }) 验证其投入
返回时 { status: "unsupported" } 不检查存在。 当地
提供者不会发布过期的链接或公开私人文件。 留着
在任何静态文件目录外存储根; 仅公共存储路径
为明确标记的物体服务.
磁盘上的文件
对象如下: root 使用他们的存储密钥。 对象元数据是
存储于 a .beignet-storage-meta 同一根下方的侧车目录.
存储密钥使用共享 @beignet/core/ports 合同:没有空字符串,
控制字符, 空路段, 引导或跟踪 /,后鞭打,
或者说 . 编号 : .. 路径段。 这个 .beignet-storage-meta 路径段是一个
额外的本地提供者限制,因为它存储了侧车元数据.
开发工具
何时 ctx.ports.devtools 已安装, 提供者记录存储
业务 storage 观者. 事件包括操作名称,密钥,
持续时间,对象大小,能见度,以及是否点击了搜索。 对象机构是
从来没有记录.
失败行为
提供者根据需要创建目录并丢弃无效对象密钥,
元数据出错, 文件系统权限失败, 以及读取或写入失败 .
路径 traversal 在触摸文件系统前被拒绝 .
以同一键为对象的变异行为,其根被串用
在一个节点.js进程范围内的顺序,包括通过单独的
本地存储实例.
put(...) 在键的变异队列前方 分级输入流,
在短承诺锁外, 溪可能读取上一版本的
同一键而不陷入僵局和排队的身体并非全部消耗临时
磁盘空间.
get(...) 返回一发快照:其元数据和正文仍然保存在
同一版本,即使另一个操作在消耗前覆盖了密钥.
检查身体或呼叫 await object.cancel() 关闭未读快照
决了 使用 stat(...) 只读元数据.
当地测试
利用这一供应商进行当地发展或需要持久的融合测试
文档。 使用应用程序的假冒或内存 StoragePort 用于用例测试
只声明存储意图.
部署说明
仅在文件系统持久和共享的部署中使用本地存储
所有需要对象的过程。 无服务器和水平缩放
应用程序通常应当使用 @beignet/provider-storage-s3 或另一个对象商店.
提供者不协调跨进程或主机的同键写作.
许可证
麻省理工学院