@nilejs/client

中文文档
1.0.1发布于 2026/11/02TypeScriptESM + CJS

用于Nile后端框架的独立、类型安全的客户端

中文使用文档
文档目录15 节
  1. 功能
  2. 安装
  3. 使用
  4. 1. 创建客户端
  5. 2. 调用动作
  6. 3. 全型安全(推荐)
  7. 4. 发现与反思
  8. API
  9. createNileClient<T>(config)
  10. 方法
  11. 尼罗河1.0.3响应
  12. 套接字。IO操作和主题
  13. 上传
  14. 兼容性
  15. 许可证

@nilejs /客户端

类型安全的前端客户端 尼罗河Js 后端。

功能

  • 类型安全的: 为服务、操作和有效负载检查使用共享或cli生成的后端类型。
  • 优雅的错误处理: 返回与Nile Js后端相同的Result模式(isOk, isErr, value, error),而不是抛出异常。
  • 小: HTTP调用使用平台 fetch. 唯一的运行时依赖项是 socket.io-client,用于套接字客户端。
  • 灵活: 支持每个请求的自定义标头、凭据和超时。

安装

# Using npm
npm install @nilejs/client

# Using pnpm
pnpm add @nilejs/client

# Using bun
bun add @nilejs/client

使用

1. 创建客户端

import { createNileClient } from "@nilejs/client";

const nile = createNileClient({
  baseUrl: "http://localhost:8000/api",
  credentials: "include",
});

2. 调用动作

const result = await nile.invoke({
  service: "tasks",
  action: "create",
  payload: { title: "Buy milk" },
});

if (result.isErr) {
  console.error("Action failed:", result.error);
} else {
  console.log("Success:", result.value);
}

使用Nile CLI生成类型: nile generate schema --output ./src/generated

然后使用生成的 ServicePayloads 地图:

import { createNileClient } from "@nilejs/client";
import type { ServicePayloads } from "./generated/types";

const nile = createNileClient<ServicePayloads>({ 
  baseUrl: "/api" 
});

// Full autocomplete and type-checking for service, action, and payload
await nile.invoke({
  service: "tasks",
  action: "create",
  payload: { title: "Buy milk" }
});

4. 发现与反思

// Explore services and actions
const services = await nile.explore({ service: "*", action: "*" });

if (services.isOk) {
  console.log(services.value);
}

// Fetch action schemas
const schemas = await nile.schema({ service: "tasks", action: "*" });

if (schemas.isOk) {
  console.log(schemas.value);
}

API

createNileClient<T>(config)

返回一个Nile客户端实例。

  • config.baseUrl:你的Nile API的基础URL(例如: http://localhost:8000/api)。
  • config.credentials:请求凭证(include, omit, same-origin)。
  • config.headers:每个请求中包含的全局标头。
  • config.timeout:默认请求超时时间,单位为毫秒(默认:30000)。

方法

所有方法都返回 Promise<ClientResult<T>>. 调用从不抛出:

  • 成功: { isOk: true, isErr: false, value: T, error: null, message? },在那里 message HTTP调用的服务器成功消息是什么
  • 失败: { isOk: false, isErr: true, value: null, error: string, details },在那里 details 保存服务器附加的任何数据,例如验证问题。网络故障和超时也是故障。

检查 isErr 首先,然后阅读 error 或者 value. 年长的 data 字段仍然作为弃用别名存在(成功时的值, null (当失败时),现有的代码继续工作。

  • invoke(params):执行特定的服务动作。
  • explore(params):使用通配符发现服务/操作。
  • schema(params):以JSON模式获取动作模式。

传入每个呼叫设置 fetchOptions. 报头与客户端配置的报头合并;无论大小写如何,每次调用的值都会覆盖相同的标头。两个 Headers 支持实例和头元组。超时包括读取响应体和连接;一个可选的 signal 可以取消通话。

const controller = new AbortController();
const result = await nile.invoke({
  service: "tasks",
  action: "create",
  payload: { title: "Ship the next feature" },
  fetchOptions: {
    headers: { Authorization: "Bearer your-session-token" },
    timeout: 5000,
    signal: controller.signal,
  },
});

尼罗河1.0.3响应

HTTP响应包含 status, message 和 data. 客户端将这些映射到其现有的Result API;它保留自定义消息、Zod的美化验证消息和生成的诊断引用。默认的成功消息为 Action completed.

对于验证失败, result.error 消息是否可读 result.details 包含 { errorCode, issues }. ValidationFailureData 为缩小此未知故障数据的应用程序导出。其他的失败可能会带来不同的细节,所以在使用它之前检查它的形状。诊断故障可能包括 Error Code: <unique-code> - <message> 在留言中。将代码视为与后端日志共享的引用;不要将其作为固定的错误类别。

套接字。IO操作和主题

创建一个单独的套接字客户端。它拥有连接;您不需要在每次调用中传递套接字。使用共享类型、生成的操作类型,或者显式地定义你的前端契约。还必须在后端配置主题定义和授权策略。

import { createNileSocketClient } from "@nilejs/client";
import type { ServicePayloads } from "./generated/types";

type Topics = {
  "tasks.changed": {
    data: { taskId: string; status: string };
  };
};

const socket = createNileSocketClient<ServicePayloads, Topics>({
  baseUrl: "http://localhost:8000",
  auth: () => {
    return { token: "your-session-token" };
  },
});

const subscription = await socket.receive({
  topic: "tasks.changed",
  onMessage: (message) => {
    console.log(message.data.taskId, message.data.status);
  },
});

const result = await socket.invoke({
  service: "tasks",
  action: "create",
  payload: { title: "Ship the next feature" },
});

const publication = await socket.send({
  topic: "tasks.changed",
  data: { taskId: "task-123", status: "done" },
});

if (subscription.isOk) {
  await subscription.value.unsubscribe();
}
socket.close();

只要应用程序需要实时更新,就保持客户端打开。连接是惰性的,订阅在重新连接后重新加入,并且不自动缓冲或重试断开的写操作。从提供的类型中检查主题名称、数据和任何所需的范围;Nile对它们进行验证,并在后端执行策略。服务器可以同时公开HTTP和套接字。看到 尚 用于服务器设置。

上传

const result = await nile.upload({
  service: "documents",
  action: "upload",
  files: { document: file },
  fields: { title: "Invoice" },
  fetchOptions: { timeout: 60000 },
});

多部分调用与JSON调用共享相同的取消、截止日期和结果行为。Content-Type由运行时设置,因此多部分边界是正确的。

兼容性

版本1.0.1支持Nile 1.0.3和1.0.4,同时保留现有的HTTP和套接字客户端api。它修复了标头合并、取消和超时清理;它不会在Nile的有线合同中增加油田。

许可证

麻省理工学院

版本与发布记录

@nilejs/client 共发布 5 个版本,首次发布于 2026/03/01;过去 12 个月发布了 5 个版本。

版本发布日期距今
1.0.1latest2026/11/021 天前
1.0.02026/10/249 天前
0.0.32026/04/196 个月前
0.0.22026/03/018 个月前
0.0.12026/03/018 个月前

关于 @nilejs/client 的常见问题

@nilejs/client 是什么?

用于Nile后端框架的独立、类型安全的客户端

如何安装 @nilejs/client?

在项目目录运行 npm install @nilejs/client,或使用 pnpm add / yarn add / bun add。

@nilejs/client 支持 TypeScript 吗?

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

@nilejs/client 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@nilejs/client 可以商用吗?

@nilejs/client 使用 未声明 许可。package.json 没有声明许可证。没有许可证的代码默认保留全部权利,商用前请联系作者或查看仓库中的 LICENSE 文件。以上为概括,不构成法律意见,请以许可原文为准。

@nilejs/client 还在维护吗?

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