@nxgt/janus-kit

中文文档
0.1.36发布于 2026/11/02MITTypeScriptES Module

@nxgt/janus连接在一个调用中,每个数据库有一个子路径——PostgreSQL通过Drizzle, MongoDB——在Redis中有会话,遥测,健康检查和关闭

中文使用文档
文档目录8 节
  1. 安装
  2. 子路径
  3. API
  4. 配置
  5. 陷阱
  6. 文档
  7. 类型安全,计数
  8. 执照

@nxgt / janus-kit

@nxgt/janus 一通电话: PostgreSQL的用户和权限 @nxgt/janus-drizzle 或者在MongoDB中 @nxgt/janus-mongo,会话和一次性令牌 复述,通过 @nxgt/janus-redis遥测,健康检查 最后。

import { janus, scryptHasher } from '@nxgt/janus';
import { defineModel, permissions } from '@nxgt/janus/permissions';
import { connectKit, defineConfig } from '@nxgt/janus-kit/drizzle';
import { z } from 'zod';

export const kit = await connectKit(
  defineConfig({
    postgres: { url: process.env.JANUS_DATABASE_URL! }, // Janus's own database
    redis: { url: process.env.REDIS_URL! },             // optional: sessions and tokens
    telemetry: true,                                    // optional: @nxgt/janus-telemetry
    auth: (adapters) =>
      janus({
        user: z.object({ email: z.email(), name: z.string() }),
        password: { login: 'email' },
        hasher: scryptHasher(),
        ...adapters, // { store, relations }
      }),
    access: ({ relations, auth }) =>
      permissions({
        model: defineModel({
          subjects: auth.types,
          types: {
            document: {
              related: { owners: ['user'], viewers: ['user'] },
              permits: { view: ['owners', 'viewers'] },
            },
          },
        }),
        store: relations,
      }),
  }),
);

const current = await kit.auth.authenticate(request); // null when signed out
if (current) await kit.access.can(current.user, 'view', { type: 'document', id: 'd1' });
const health = await kit.ping(); // { ok, postgres, redis } — never throws
await kit.close();

你还在写 janus() 和 permissions(),在两个函数中,所以 它们推断的每个类型都是在你写它们的地方推断出来的: kit.auth.signIn 获取您的登录字段, kit.access.can 你的权限。工具包交给他们 存储,打开和关闭连接,并在启动时检查什么 否则第一次登录就会失败。

0. x。 一个小版本仍然可能改变表面;更新日志告诉我们该怎么做。

安装

bun add @nxgt/janus-kit @nxgt/janus @nxgt/redis zod
bun add @nxgt/janus-drizzle @nxgt/drizzle drizzle-orm   # for @nxgt/janus-kit/drizzle
bun add @nxgt/janus-mongo @nxgt/mongo mongodb           # for @nxgt/janus-kit/mongo
bun add @nxgt/janus-telemetry @nxgt/telemetry           # only for telemetry: true
bun add -d @types/bun                                   # the kit's types name Bun's RedisOptions

所需的对等体,无论子路径:

  • @nxgt/janus;
  • @nxgt/redis >=0.3.1 <1, zod 这是它所需要的,即使有 数据库中的会话:工具包的类型命名其连接;
  • typescript 6或7。

同行的 @nxgt/janus-kit/drizzle -可选的 package.json,所以。 另一个子路径上的应用程序不安装它们,但这是必需的 一:

  • @nxgt/janus-drizzle:您的模式文件导入 defineJanusTables 从它 要创建表,必须与工具包的store查询相同的定义;
  • @nxgt/drizzle >=0.6.1 <1 和 drizzle-orm 1.0(从 1.0.0-rc.4), PostgreSQL。

同行的 @nxgt/janus-kit/mongo,可选方式相同:

  • @nxgt/janus-mongo: syncMongoAdapter 创建集合和 Kit的store必须查询相同的定义;
  • @nxgt/mongo >=0.17.0 <1 和 mongodb 7.

这个 @nxgt/* 在每个CI上测试楼层,而不是声明楼层:在楼层作业中 运行,套件的mongo规格和类型检查运行 @nxgt/mongo 0.17.0, 它的整个套件和类型检查 @nxgt/redis 0.3.1, @nxgt/drizzle 0.6.1 和 @nxgt/telemetry 0.2.1.

@nxgt/janus-telemetry 是否可选对等体,仅在何时加载 telemetry 是 true;它需要 @nxgt/telemetry >=0.2.1 <1 作为自己的同伴。 @nxgt/janus-redis 是一个依赖项:您的代码永远不会导入它。

它继续运行 包子 只有:工具包打开PostgreSQL在Bun的 SQL 和复述, 在包的 RedisClient. 它需要PostgreSQL 15或更高版本,或MongoDB 副本集,以及Redis 7.0或更高版本。就像 @nxgt/janus,它期望 "moduleResolution": "bundler".

子路径

一个工具包,每个数据库一个子路径。 这个包裹有 没有根条目,所以 导入将数据库命名为: import … from '@nxgt/janus-kit' 失败与 TS2307. 复述、遥测 ping 和 close 子路径是相同的吗 你使用。

子路径数据库数据库键什么 connectKit 支票
@nxgt/janus-kit/drizzlePostgreSQL,通过 @nxgt/janus-drizzlepostgres雅努斯的五张表是存在的
@nxgt/janus-kit/mongoMongoDB,通过 @nxgt/janus-mongomongoJanus的四个集合及其索引存在;其他任何不同都是警告

在MongoDB上,上面的例子只改变了第一行:

import { connectKit, defineConfig } from '@nxgt/janus-kit/mongo';

export const kit = await connectKit(
  defineConfig({
    mongo: { url: process.env.JANUS_MONGO_URL! }, // mongodb://…/janus — the path names the database
    redis: { url: process.env.REDIS_URL! },
    auth: (adapters) => janus({ /* … */ ...adapters }),
  }),
);
kit.db; // the Db; (await kit.ping()).mongo

API

两个子路径导出相同的名称;它们的不同之处在于数据库键和 什么 db 是多少。

出口它是什么?
defineConfig(config)检查配置并回答,冻结。它不连接任何东西,也不读取任何环境变量。怎么扔了一个 TypeError 这里是应用程序开始的地方。
connectKit(config)再次检查配置,打开数据库和Redis,检查Janus的表或集合,构建 auth 和 access,并回答了问题。失败,并伴有 Error 命名要做什么- a TypeError 对于它无法读取的URL -关闭它打开的内容。
Kit什么 connectKit 答案: auth; access 当配置; db例如,Drizzle实例或MongoDB Db; redis,连接或 undefined; ping(options?); close();和 [Symbol.asyncDispose].
KitConfig, RedisConfig, PostgresConfig 从 /drizzle 或者 MongoConfig 从 /mongo配置的类型。
Adapters, AccessWiring什么 auth 和 access 给出: { store, relations }, { relations, auth }.
Health, PingResult什么 ping 答案: { ok, postgres, redis? } 或者 { ok, mongo, redis? },每个 { ok: true, latencyMs } 或者 { ok: false, error }.

配置

关键
postgres上需要 /drizzle{ url } 在Janus数据库中,a postgres:// 或者 postgresql:// URL,工具包打开和关闭它;或 { db }你打开的Drizzle实例 从来没有关闭 靠工具箱。 tables:当表在自己的PostgreSQL模式中时,你的模式文件导出什么。
mongo上需要 /mongo{ url, clientOptions? } 在Janus数据库中,a mongodb:// 或者 mongodb+srv:// URL,其路径命名工具包打开时使用的数据库 serverSelectionTimeoutMS: 5_000 和关闭;或 { db },一个 Db 你打开, 从来没有关闭 靠工具箱。
redis可选{ url, prefix?, clientOptions? },这是工具箱打开的地方 enableOfflineQueue: false 和关闭;或 { connection, prefix? },它永远不会关闭。如果没有,会话和令牌将留在数据库中。
telemetry可选true 包装 auth 与 instrumentJanus 和 access 与 instrumentPermissions.
auth要求(adapters) => janus({ …, ...adapters }).
access可选({ relations, auth }) => permissions({ model, store: relations }). 缺席,工具包没有 access, kit.access 不编译。

adapters 是 { store, relations }:来自数据库的用户、会话和 当连接时,从Redis中获取令牌,以及关系存储,因此删除用户 删除所有命名它们的元组。 配置指南 有每个钥匙的详细信息。

陷阱

  • 雅努斯的表格来自你的迁移。 connectKit 检查所有 其中五个已经存在,但拒绝以其他方式开始,并指名道姓。创建它们 drizzle-kit,从 defineJanusTables(),因为 @nxgt/janus-drizzle的指导 所示。
  • 在他们自己的PostgreSQL模式中,pass postgres.tables. 没有它, 工具包查找,商店查询, users 在连接中 search_path: public,其中您的应用程序可能有 users 它的 自己的。
  • Janus的收藏来自 syncMongoAdapter,部署步骤。 connectKit 将它们与 @nxgt/janus-mongo的定义,写作 什么都没有。丢失的集合或索引拒绝启动:MongoDB会 在第一次写入时创建一个缺失集合 没有唯一索引 在登录. 一个验证器、一个选项或一个索引的选项只有警告不同 (JANUS_KIT_COLLECTIONS_DRIFTED),因此回滚仍然开始。
  • kit.auth.collectExpired() 答案 UNSUPPORTED 在 /mongo:一个TTL 索引删除失效的会话和令牌。在PostgreSQL上安排它 只有,它删除了这两个。
  • 路径中没有数据库的MongoDB URL使用 test,司机的。 违约。在URL中命名Janus的数据库: mongodb://…/janus.
  • 如果MongoDB在5秒后没有回答,则会失败测量的;测量的 装备的 serverSelectionTimeoutMS在美国,司机的工资是30美元。一个请求 在复制集期间,选举可以失败而不是等待;通过 clientOptions: { serverSelectionTimeoutMS } 等待更长时间。
  • Redis在启动时关闭,大约需要31秒才能失败测量: Bun的客户端重新尝试它的第一个连接。在运行时,工具包 enableOfflineQueue: false 使中断立即失败。
  • 你交什么,你就交什么。 一、 db 或者一个 connection 从 配置是开放的 kit.close().
  • @nxgt/mongo 每个URL共享一个客户端,因为 @nxgt/redis 下面: 用其他选项连接到Janus的MongoDB URL被拒绝。
  • @nxgt/redis 每个URL共享一个客户端。 如果您的应用程序连接 到相同的Redis URL, connectRedis 拒绝的 第二。给Janus一个自己的URL,比如另一个数据库号,或者 通过 { connection }.

文档

  • 指南:每个键的配置,健康检查; 和关闭
  • 故障排除:查看您看到的错误信息
  • 路线图下一步是什么,以及什么是没有计划的

类型安全,计数

16个貌似合理的错误被编译器拒绝了,每个错误都有一个 @ts-expect-error 箱子:10英寸 test/types/kit.ts在PostgreSQL上,

  • kit.access 在没有配置的工具包上 access;
  • 用户类型 auth 没有;
  • 模型不具备的权限;
  • 两个 postgres.url 和 postgres.db;
  • 两个 redis.url 和 redis.connection;
  • redis.clientOptions 旁边一个 connection 已经打开,
  • postgres.schema 而不是里面的表格;
  • 没有的配置 auth;
  • postgres 既无 url 也不 db;
  • telemetry 作为一个字符串,作为一个环境变量读;

6英寸 test/types/mongo.ts, over MongoDB:

  • kit.access 在没有配置的工具包上 access;
  • ping()的 postgres 在MongoDB工具包上,它回答 mongo;
  • 两个 mongo.url 和 mongo.db;
  • mongo.clientOptions 旁边一个 Db 其客户端已经打开;
  • 这个 postgres 给MongoDB工具包的关键;
  • mongo 既无 url 也不 db.

执照

麻省理工学院

版本与发布记录

@nxgt/janus-kit 共发布 37 个版本,首次发布于 2026/09/26;过去 12 个月发布了 37 个版本。

版本发布日期距今
0.1.36latest2026/11/021 天前
0.1.352026/11/021 天前
0.1.342026/10/304 天前
0.1.332026/10/276 天前
0.1.322026/10/276 天前
0.1.312026/10/276 天前

关于 @nxgt/janus-kit 的常见问题

@nxgt/janus-kit 是什么?

@nxgt/janus连接在一个调用中,每个数据库有一个子路径——PostgreSQL通过Drizzle, MongoDB——在Redis中有会话,遥测,健康检查和关闭

如何安装 @nxgt/janus-kit?

在项目目录运行 npm install @nxgt/janus-kit,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:typescript(^6.0.3 || ^7.0.0)、@nxgt/janus(^0.36.0)、@nxgt/redis(>=0.3.1 <1)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@nxgt/janus-kit 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@nxgt/janus-kit 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@nxgt/janus-kit 可以商用吗?

@nxgt/janus-kit 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@nxgt/janus-kit 还在维护吗?

最新版本 0.1.36 发布于 2026/11/02(1 天前);至今共发布 37 个版本,其中过去 12 个月发布了 37 个;首次发布于 2026/09/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。