# @fnproject/fdk 中文文档

规范地址：https://npmcn.com/package/%40fnproject/fdk/

版本：0\.0\.114
npm 元数据更新时间：2026-11-03T16:24:41.428Z
中文译文更新时间：2026-11-15T03:33:59.733Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40fnproject/fdk
原文对照：https://npmcn.com/package/%40fnproject/fdk/?lang=original
项目主页：https://github.com/fnproject/fdk-node#readme
源码仓库：https://github.com/fnproject/fdk-node

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：112 kB，6 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：1 个
- 首次发布：2018-02-15T20:46:51.183Z
- 最新版本发布：2026-11-03T16:24:41.101Z
- 近 30 天下载量：22316（2026-10-15 至 2026-11-13，npm 官方下载统计）
- 已发布版本数：93（近 12 个月 18 个）

## 中文简介

Fn 函数开发工具箱

## 安装

```sh
npm install @fnproject/fdk
```

也可以使用：`pnpm add @fnproject/fdk`、`yarn add @fnproject/fdk`、`bun add @fnproject/fdk`

## README

# Fn 节点功能开发者 Kit.js

此函数开发者 Kit 使其易于向 Fn 部署节点. js 函数. 它目前支持使用JSON格式的默认(cold)和热功能.

## 创建节点函数

写入一个 Node.js 函数只是写一个处理器函数的问题 您通过 FDK 引用您的功能.

以创建节点函数开始 `fn init` 并安装 FDK :

```sh
fn init --runtime node nodefunc
cd nodefunc
```

这创造了一个简单的问候世界功能 `func.js`数字 :

```javascript
const fdk=require('@fnproject/fdk');

fdk.handle(function(input){
  let name = 'World';
  if (input.name) {
    name = input.name;
  }
  return {'message': 'Hello ' + name}
})
```

处理器函数将发送到函数的字符串输入 并返回响应字符串。 使用FDK 你不必担心阅读 输入从标准输入和写入到标准输出以返回您的响应. FDK让你专注于你的功能逻辑而不是力学.

现在运行它!

```sh
fn deploy --local --app fdkdemo 
fn invoke fdkdemo nodefunc 
```

现在您有一个基本的运行中节点函数,您可以修改并添加您想要的.

```sh
echo -n '{"name": "Tom"}' | fn invoke fdkdemo nodefunc
```

你应该看看结果

```sh
{"message": "Hello Tom"}
```

## 函数背景

函数引用上下文细节通过可选函数参数提供. 要接收上下文对象,只需在您的处理器函数中添加第二个参数. 在以下例子中 `callID` 从上下文获得并列入 响应消息 :

```javascript
const fdk=require('@fnproject/fdk');

fdk.handle(function(input, ctx){
  let name = 'World';
  if (input) {
    name = input;
  }
  return 'Hello ' + name + ' from Node call ' + ctx.callID + '!';
})
```

上下文载有关于请求的其他上下文信息,例如:

-   `ctx.config` : 包含函数配置变量(来自环境)的对象(只读)
-   `ctx.headers` : 包含事件输入头作为字符串列表(只读)的对象
-   `ctx.deadline` (单位:千美元) `Date` 显示函数调用何时必须处理的对象
-   `ctx.callID` : 当前呼叫的呼叫ID
-   `ctx.fnID` : 当前函数的函数 ID
-   `ctx.memory` : 分配给此函数的 MB 中 RM 数量
-   `ctx.contentType` : 收到的请求内容类型( 如果设定, 否则无效)
-   `ctx.setResponseHeader(key,values...)` : 设置一个或多个值的响应头
-   `ctx.addResponseHeader(key,values...)` : 将数值添加到现有的响应头
-   `ctx.responseContentType` 设置/读取函数的响应内容类型(读取/写入)
-   `ctx.httpGateway` 此函数的 HTTP 网关上下文( 如果设置) 见 `HTTPGatewayContext` 下级

## 同步函数响应

通过返回 Javascript 返回函数的同步响应 `Promise` 从函数机构:

```javascript
const fdk=require('@fnproject/fdk');

fdk.handle(function(input, ctx){
  return new Promise((resolve,reject)=>{
     setTimeout(()=>resolve("Hello"),1000);
  });
})
```

您还可以使用 `async`编号 :`await` 要求公约发挥作用.

## 处理非 Json 输入和输出

默认情况下, FDK 会尝试将输入转换成 JSON 对象, 否则会回到它的字符串格式 .

同样,默认一个函数的输出会作为JSON对象处理并使用JSON.stringify进行转换.

要更改输入的处理, 您可以添加一个额外 `options` 参数改为 `fdk.handle` 指定输入处理策略:

```javascript
function myfunction(input,ctx){}

fdk.handle(myfunction, {inputMode: 'string'})
```

有效的输入模式是:

-   `json` (默认)试图将输入解析为json或返回到原始(可能为二进制)字符串值
-   `string` 总是将输入视为字符串
-   `buffer` 将输入读入 a `Buffer` 对象并传递到您的函数

要更改默认函数的输出处理, 您应该使用响应装饰符来包装结果值 :

```javascript
function myfunction(input,ctx){
   return fdk.rawResult("Some string")
}

fdk.handle(myfunction)
```

现有的装饰有:

-   `rawResult({string|Buffer})` 将结果直接传递到响应 - 值可以是字符串或缓冲器 - 这将不编码字符串对象上的引用
-   `streamResult({ReadableStream})` 管道内装 `ReadableStream` 输入输出 - 这允许从文件或 HTTP 回复中处理数据

## 使用 HTTP 头并设置 HTTP 状态代码

您可以使用 `ctx.protocol.header(key)`,此返回匹配头头的第一个头值 `key` (条块化后)和 `ctx.protocol.headers` 返回包含所有信头的对象.

```javascript
const fdk=require('@fnproject/fdk');

fdk.handle(function(input, ctx){
  
  let hctx = ctx.httpGateway
  console.log("Request URL" , hctx.requestURL)
  
  console.log("Authorization header:" , hctx.getHeader("Authorization"))
  console.log( hctx.headers) // prints e.g. { "Content-Type": ["application/json"],"Accept":["application/json","text/plain"] } 
})
```

外出信头和HTTP状态代码可以以类似方式被修改:

```javascript
const fdk=require('@fnproject/fdk');

fdk.handle(function(input, ctx){
    let hctx = ctx.httpGateway

   hctx.setResponseHeader("Location","http://example.com")
   hctx.statusCode = 302
})
```

这个 `HTTPGatewayContext` 对象的接口与 `Context` 但只访问函数的 HTTP 头 :

-   `hctx.requestURL` : 获取网关接收到的函数的 http 请求 URL( 否设置)
-   `hctx.method` : 获取用于引用网关的 HTTP 请求方法
-   `hctx.headers` : 获取收到的请求的 HTTP 头( 只读)
-   `hctx.statusCode` : 设置 HTTP 的 HTTP 状态代码 打开 `hctx.setResponseHeader(key,values..)`, (中文(简体) ), `hctx.addResponseHeader(key,values)` 设置/添加响应信头

## Fn和Node.js 依赖关系

Fn 处理 Node.js 依赖性的方式如下:

-   如果有的话 `package.json` 不存在 `node_modules` 目录, Fn 构建运行于 `npm install` 在构建过程中安装您的依赖关系.
-   如果 `node_modules` fn 假设您自己提供了依赖性,但没有安装.

## 常见问题

### @fnproject/fdk 是什么？

Fn 函数开发工具箱

### 如何安装 @fnproject/fdk？

在项目目录运行 npm install @fnproject/fdk，或使用 pnpm add / yarn add / bun add。

### @fnproject/fdk 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/fnproject\_\_fdk 是否存在。

### @fnproject/fdk 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @fnproject/fdk 可以商用吗？

@fnproject/fdk 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @fnproject/fdk 的下载量有多少？

根据 npm 官方下载统计，@fnproject/fdk 在 2026/10/15 – 2026/11/13 这 30 天内被下载 22,316 次，日均约 744 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @fnproject/fdk 还在维护吗？

最新版本 0\.0\.114 发布于 2026/11/04（12 天前）；至今共发布 93 个版本，其中过去 12 个月发布了 18 个；首次发布于 2018/02/16。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

