@fastify/send

中文文档
4.2.1发布于 2026/11/03MITTypeScriptCommonJS构建来源已验证近 30 天下载 3040.1万

在 Range 和有条件的 GET 支持下更好地流出静态文件服务器

中文使用文档
文档目录15 节
  1. 安装
  2. 类型脚本
  3. API 密码
  4. 发送( req, 路径, [选项])
  5. .mime (英语)
  6. 缓存
  7. 调试
  8. 正在测试
  9. 实例
  10. 提供特定文件
  11. 服务目录中的所有文件
  12. 自定义文件类型
  13. 自定义目录索引视图
  14. 从自定义错误处理的根目录服务
  15. 许可证

@ fastify/ 发送

CI NPM version neostandard javascript style

发送是一个用于从文件系统流出文件作为 HTTP 响应的库 支持部分响应(范围),有条件的GET谈判(如果-Match, 若-未修改-辛,若-无-Match,若-已修改-辛,高测试覆盖率, 和颗粒性事件,可借以在 应用或框架.

安装

这是一个 节点.js 模块 npm 登记。安装使用 npm install 命令数字 :

$ npm install @fastify/send

类型脚本

@types/mime@3 如果想要使用类型脚本,必须使用; @types/mime@4 删除了 mime 类型.

$ npm install -D @types/mime@3

API 密码

const send = require('@fastify/send')

发送( req, 路径, [选项])

提供 statusCode, (中文(简体) ), headers,以及 stream 给定路径发送到 res编辑 req 是节点.js HTTP 请求和 path 是一个 urlencoded 路径 以发送(urlencoded,而非实际文件系统路径).

选项

接受区域

启用或禁用接受范围请求, 默认为真实 . 禁用此选项不会发送 Accept-Ranges 忽略内容 会 议 日 程 和 议 程 Range 请求头.

缓存控制

启用或禁用设置 Cache-Control 响应头,默认为 没错 禁用会忽略 immutable 财务报告和审定财务报表 maxAge 选项.

内容类型

默认情况下,此库使用 mime 模块设置 Content-Type 以请求的文件扩展名为基础的响应.

要禁用此功能, 设置 contentType 改为 false。 。 。 . 这个 Content-Type 如果已禁用, 需要手动设置页眉 .

点文件

设定“ 点文件” 遇到时如何处理 。 点文件是一个文件 或者以点("")开头的目录. 注意此检查是在 路径本身而不检查路径是否存在于 磁盘。 若为 root 指定,只有根上方的点文件是 选中( 即当设置时, 根本身可以在点文件中) 以"dey"来表示.

  • 'allow' 对点文件没有特殊待遇.
  • 'deny' 发送一个403 对于任何一个点文件的请求.
  • 'ignore' 假装点文件不存在 404.

默认值为 类似 改为 'ignore',但 此默认不会忽略目录中开始的文件 带有点,用于后相相.

结束

流结束的字节相抵,默认为文件长度 减一. 结束在溪流中是包容性的,意思是 end: 3 将包括 溪中第四字节.

爱塔格

启用或禁用 etag 生成, 默认为真实 .

扩展

如果给定文件不存在,请尝试附加给定的扩展名之一, 以给定顺序。 默认情况下,此选项已禁用( 设置为 false) (中文(简体) ). 一个 为无扩展名的 HTML 文件服务的示例值 : ['html', 'htm']。 。 。 . 如果请求的文件已有扩展名, 则跳过 .

不可改变

启用或禁用 immutable 指令中 Cache-Control 回应 页眉,默认为 false如果设置为 true,则 maxAge 选项应当 也指定可以缓存。 这个 immutable 指令将防止 支持客户在其存在期间提出有条件请求 maxAge 选项以检查文件是否更改.

指数

默认发送支持“ index.html” 文件以禁用此功能 设定 false 或提供新索引通过字符串或数组 以优先顺序排列.

最后修改

启用或禁用 Last-Modified 标题,默认为真. 使用文件 系统的最后修改值.

最大年龄

为 HTTP 缓存提供以毫秒为单位的最大年龄, 默认为 0 . 也可以是被 分钟 模块.

最大线程切变大小

指定最大响应内容大小,默认为整个文件大小. 当 acceptRanges 这是真的.

文件夹

以最终选中的文件的绝对路径和文件系统统计调用 在文件解析后,但在回复处理和文件流创建之前. 召回可能是同步的,也可能是还原承诺. 如果它还回来, send 等待它解决。 如果召回 放弃或返回的承诺 拒绝,操作中止 send() 拒绝.

根号

服务文件相对于 path。 。 。 .

开始

启动流的字节相抵,默认为 0。 开始是包容性的, 含义 start: 2 将包含在溪流中的第3字节.

高水压

提供时, 此选项将设定内部的字节数最大值 缓冲器在从原始资源中读取之前会保持. 如果您省略了此选项( 或通过未定义的) , 节点会回到 其可读二进制流的内置默认值.

.mime (英语)

这个 mime 导出是全球实例 mime npm 模块。 。 。 .

用于配置与文件扩展名相关的 MIME 类型 以及关于如何解决文件的 MIME 类型的其他选项(如 用于未知文件扩展名的默认类型).

缓存

没错 没有 执行内部缓存, 您应该使用反向代理缓存 比如这个的Varnish 或者那些叫CDN的花花公子 狦 应用程序小到能够从单节点内存中受益 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}它已经足够小了 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}它完全不需要被挖出 {\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}.

调试

启用 debug() 仪器输出导出 诺德-DEBUG数字 :

$ NODE_DEBUG=send node app

正在测试

$ npm install
$ npm test

实例

提供特定文件

这个简单的例子会向所有请求发送一个特定文件.

const http = require('node:http')
const send = require('send')

const server = http.createServer(async function onRequest (req, res) {
  const { statusCode, headers, stream } = await send(req, '/path/to/index.html')
  res.writeHead(statusCode, headers)
  stream.pipe(res)
})

server.listen(3000)

服务目录中的所有文件

这个简单的例子将只服务于一个 指定目录为顶级。 例如,请求 GET /foo.txt 将返回 /www/public/foo.txt。 。 。 .

const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')

const server = http.createServer(async function onRequest (req, res) {
  const { statusCode, headers, stream } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
  res.writeHead(statusCode, headers)
  stream.pipe(res)
})

server.listen(3000)

自定义文件类型

const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')

// Default unknown types to text/plain
send.mime.default_type = 'text/plain'

// Add a custom type
send.mime.define({
  'application/x-my-type': ['x-mt', 'x-mtt']
})

const server = http.createServer(function onRequest (req, res) {
  const { statusCode, headers, stream } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
  res.writeHead(statusCode, headers)
  stream.pipe(res)
})

server.listen(3000)

自定义目录索引视图

这是为目录结构服务的一个例子,其中包含: 自定义功能,用于提供目录的列表.

const http = require('node:http')
const fs = require('node:fs')
const parseUrl = require('parseurl')
const send = require('@fastify/send')

// Transfer arbitrary files from within /www/example.com/public/*
// with a custom handler for directory listing
const server = http.createServer(async function onRequest (req, res) {
  const { statusCode, headers, stream, type, metadata } = await send(req, parseUrl(req).pathname, { index: false, root: '/www/public' })
  if(type === 'directory') {
    // get directory list
    const list = await readdir(metadata.path)
    // render an index for the directory
    res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })
    res.end(list.join('\n') + '\n')
  } else {
    res.writeHead(statusCode, headers)
    stream.pipe(res)
  }
})

server.listen(3000)

从自定义错误处理的根目录服务

const http = require('node:http')
const parseUrl = require('parseurl')
const send = require('@fastify/send')

const server = http.createServer(async function onRequest (req, res) {
  // transfer arbitrary files from within
  // /www/example.com/public/*
  const { statusCode, headers, stream, type, metadata } = await send(req, parseUrl(req).pathname, { root: '/www/public' })
  switch (type) {
    case 'directory': {
      // your custom directory handling logic:
      res.writeHead(301, {
        'Location': metadata.requestPath + '/'
      })
      res.end('Redirecting to ' + metadata.requestPath + '/')
      break
    }
    case 'error': {
      // your custom error-handling logic:
      res.writeHead(metadata.error.status ?? 500, {})
      res.end(metadata.error.message)
      break
    }
    default: {
      // your custom headers
      // serve all files for download
      res.setHeader('Content-Disposition', 'attachment')
      res.writeHead(statusCode, headers)
      stream.pipe(res)
    }
  }
})

server.listen(3000)

许可证

许可证根据 麻省理工学院。 。 。 .

版本与发布记录

@fastify/send 共发布 17 个版本,首次发布于 2023/01/11;过去 12 个月发布了 4 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
4.2.1latest2026/11/0311 天前
4.2.02026/10/2024 天前
4.1.22026/10/101 个月前
4.1.12026/08/083 个月前
4.1.02025/06/051.4 年前
4.0.02025/02/101.8 年前

其他发布通道:next → 3.0.0-pre.fv5.1。

关于 @fastify/send 的常见问题

@fastify/send 是什么?

在 Range 和有条件的 GET 支持下更好地流出静态文件服务器

如何安装 @fastify/send?

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

@fastify/send 支持 TypeScript 吗?

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

@fastify/send 支持 ESM 还是 CommonJS?

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

@fastify/send 可以商用吗?

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

@fastify/send 的下载量有多少?

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

@fastify/send 还在维护吗?

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