NJS API 参考#
NJS 模块提供了用于扩展 Angie 功能的对象、方法和属性。
本参考仅包含 NJS 特定的、不符合 ECMAScript 标准的属性、方法和模块。符合 ECMAScript 标准的 NJS 属性和方法的定义可以在 ECMAScript 规范 中找到。 HTTP 请求对象仅在 HTTP JS 模块中可用。在 0.8.5 之前,该对象的所有字符串属性都是字节字符串。 请求参数对象,只读。 查询字符串以对象形式返回。从 0.7.6 开始,重复的键以数组形式返回,键区分大小写,键和值都会进行百分号解码。 例如,查询字符串 会被转换为 更高级的解析场景可以使用 Query String 模块和 参数对象在首次访问 这里,Angie 变量对象返回给定键的第一个值,不区分大小写,不进行百分号解码。 要将 调用此函数后,后续的数据块将直接传递给客户端,而不调用 将 备注 由于 Angie 有硬编码的最大行长度限制,只有字符串的前 2048 字节可以被记录。 完成向客户端发送响应。 传入的请求头对象,只读。 可以使用以下语法访问 主请求的传出响应头对象,可写。 如果 可以使用以下语法访问 传出的响应头应该在响应头发送给客户端之前设置;否则,头的更新将被忽略。这意味着 在 在 多值响应头(0.4.0)的字段值可以使用以下语法设置: 输出将是: 对于只接受单个字段值的标准响应头(如 HTTP 版本,只读。 布尔值,对于内部 location 为 执行到指定 备注 重定向后,在目标 location 中启动一个新的 NJS VM,原始 location 中的 VM 停止。Angie 变量的值会保留,可用于向目标 location 传递信息。从 0.5.3 开始,可以使用通过 备注 从 0.7.4 开始,该方法接受转义的 URI。 将 备注 由于 Angie 有硬编码的最大行长度限制,只有字符串的前 2048 字节可以被记录。 HTTP 方法,只读。 引用父请求对象。 客户端地址,只读。 该属性在 0.5.0 中已过时,在 0.8.0 中被移除。应该使用 客户端请求体(如果尚未写入临时文件)(从 0.5.0 开始)。要确保客户端请求体在内存中,其大小应受 与 返回键值对数组,完全按照从客户端接收的原样(0.4.1)。 例如,对于以下请求头: 可以使用以下语法收集所有 输出将是: 头字段名称不会转换为小写,重复的字段值不会合并。 返回响应头的键值对数组(0.4.1)。头字段名称不会转换为小写,重复的字段值不会合并。 该属性在 0.5.0 中已弃用,在 0.8.0 中被移除。应该使用 包含子请求响应体,只读(从 0.5.0 开始)。 与 向客户端发送带有指定 可以将重定向 URL(用于代码 301、302、303、307 和 308)或响应正文文本(用于其他代码)指定为第二个参数。 向客户端发送响应正文的一部分。发送的数据可以是字符串或 Buffer(0.5.0)。 将数据添加到要转发到下一个正文过滤器的数据块链中(0.5.2)。实际转发会在稍后发生,即当前链的所有数据块都处理完毕时。 数据可以是字符串或 Buffer。 布尔值, 布尔值, 该方法只能从 向客户端发送 HTTP 头。 设置 状态,可写。 使用给定的 子请求与客户端请求共享其输入标头。要向代理服务器发送与原始标头不同的标头,可以使用 如果 参数字符串,默认使用空字符串。 请求主体,默认使用父请求对象的请求主体。 HTTP 方法,默认使用 布尔标志(0.3.9);如果为 完成 从 0.3.8 开始,如果未提供 例如,要查看子请求中的所有响应标头: 请求中的当前 URI,已规范化,只读。 Angie 变量作为 Buffers,可写(自 0.5.0 起)。 Angie 变量对象,可写(自 0.2.8 起)。 例如,要获取 从 0.8.6 开始,可以使用以下语法访问正则表达式捕获: Angie 对在 变量可写的条件是: 它是使用 HTTP 或 Stream 的 它在 Angie 配置文件中被引用 即便如此,某些内置变量仍然无法被赋值(例如 在 备注 由于 Angie 具有硬编码的最大行长度限制,因此只能记录字符串的前 2048 个字节。 流会话对象仅在 Stream JS 模块中可用。在 0.8.5 之前,该对象的所有字符串属性都是字节字符串。 将当前阶段处理程序的退出 可能的代码值: 只能从阶段处理程序函数调用: 在 备注 由于 Angie 具有硬编码的最大行长度限制,因此只能记录字符串的前 2048 个字节。 在 备注 由于 Angie 具有硬编码的最大行长度限制,因此只能记录字符串的前 2048 个字节。 注销由 为指定的 来自客户端的新数据(字符串)。 发送到客户端的新数据(字符串)。 来自客户端的新数据(Buffer)(自 0.5.0 起)。 发送到客户端的新数据(Buffer)(自 0.5.0 起)。 完成回调具有以下原型: 布尔值,:samp:true 表示数据是最后一个缓冲区。 客户端地址,只读。 Angie 变量作为 Buffers,可写(自 0.5.0 起)。 将数据添加到将在正向方向转发的数据块链中:在下载回调中发送到客户端;在上传中发送到上游服务器(0.2.4)。实际转发会在稍后发生,即当前链的所有数据块都处理完毕时。 数据可以是字符串或 Buffer(0.5.0)。 布尔值,:samp:true 表示该缓冲区是最后一个缓冲区。 布尔值,:samp:true 表示该缓冲区应具有 该方法可以在每次回调调用中多次调用。 与 与 会话状态代码,:samp:$status 变量的别名,只读(自 0.5.2 起)。 设置 Angie 变量对象,可写(自 0.2.8 起)。变量只有在 Angie 配置文件中被引用时才可写。即便如此,某些内置变量仍然无法被赋值。 在 备注 由于 Angie 具有硬编码的最大行长度限制,因此只能记录字符串的前 2048 个字节。 Angie 变量作为 Buffers,可写。 Angie 变量对象,可写。 Fetch API 的 可以使用 包含用于预填充 可以使用以下属性和方法创建新的 向 从 返回包含指定名称的所有标头值的字符串,值之间用逗号和空格分隔。 返回包含指定名称的所有标头值的数组。 对 返回布尔值,指示是否存在具有指定名称的标头。 为 Fetch API 的 可以使用 创建一个可以稍后传递给 请求主体,默认为空。 响应标头对象——包含用于预填充 HTTP 方法,默认使用 GET 方法。 可以使用以下属性和方法创建新的 返回一个 布尔值,如果主体已在请求中使用则为 包含请求的缓存模式。 包含请求的凭据,默认为 与 返回一个 包含请求方法。 包含请求的模式。 返回一个 包含请求的 URL。 可以使用 创建 响应标头对象——包含用于预填充 响应的状态码。 与状态码对应的状态消息。 可以使用以下属性和方法创建新的 获取 布尔值,如果主体已被读取则为 与 获取 布尔值,如果响应成功(状态码在 200–299 之间)则为 布尔值,如果响应是重定向的结果则为 响应的状态码。 与状态码对应的状态消息。 获取 响应的类型。 响应的 URL。 包含可选 Angie 构建名称的字符串,对应于 configure 脚本的 包含当前 Angie 配置文件的文件路径的字符串(0.8.0)。 包含 Angie 配置前缀的文件路径的字符串——Angie 当前查找配置的目录(0.7.8)。 包含当前错误日志文件的文件路径的字符串(0.8.0)。 发起请求以获取 如果 请求主体,默认为空。 读取响应的缓冲区大小,默认为 请求头对象。 响应主体的最大大小(以字节为单位),默认为 HTTP 方法,默认使用 启用或禁用 HTTPS 服务器证书验证,默认为 示例: 使用指定的日志级别将消息写入错误日志。 备注 由于 Angie 具有硬编码的最大行长度限制,因此只能记录字符串的前 2048 个字节。 包含 Angie 前缀文件路径的字符串 — 保存服务器文件的目录(0.8.0)。 包含 Angie 版本的字符串,例如: 包含 Angie 版本的数字,例如: 对应于 Angie 内部工作进程 ID 的数字,该值介于 输出一条或多条错误消息。消息可以是字符串或对象。 输出一条或多条信息消息。消息可以是字符串或对象。 输出一条或多条日志消息。消息可以是字符串或对象。 启动一个计时器,可以跟踪操作所需的时间。 停止先前由 输出一条或多条警告消息。消息可以是字符串或对象。 获取加密强度的随机值。返回作为 可以是 使用提供的 一个对象,指定要使用的算法以及所需的任何额外参数: 对于 一个字符串,应设置为 对于 一个字符串,应设置为 一个 计数器块中用于实际计数器的位数。计数器必须足够大,以免回绕。 对于 一个字符串,应设置为 初始化向量,是一个 对于 一个字符串,应设置为 初始化向量,是一个 (可选)是一个 (可选,默认为 一个 一个 解密加密的数据。返回一个包含解密数据的 一个对象,指定要使用的算法以及所需的任何额外参数。为额外参数提供的值必须与传递到相应 对于 一个字符串,应设置为 对于 一个字符串,应设置为 一个 计数器块中用于实际计数器的位数。计数器必须足够大,以免回绕。 对于 一个字符串,应设置为 初始化向量,是一个 对于 一个字符串,应设置为 初始化向量,是一个 (可选)是一个 (可选,默认为 一个 一个 从基础密钥派生位数组。返回一个 一个对象,定义要使用的派生算法: 对于 一个字符串,应设置为 一个字符串,包含要使用的摘要算法: 一个 一个 对于 一个字符串,应设置为 一个字符串,包含要使用的摘要算法: 一个 一个 对于 一个字符串,应设置为 一个 一个 一个数字,表示要派生的比特数。为了浏览器兼容性,该数字应该是 从主密钥派生一个秘密密钥。可能的值: 一个对象,定义要使用的派生算法: 对于 一个字符串,应设置为 一个字符串,包含要使用的摘要算法: 一个 一个 对于 一个字符串,应设置为 一个字符串,包含要使用的摘要算法: 一个 一个 对于 一个字符串,应设置为 一个 一个 一个对象,定义派生密钥将用于的算法: 对于 一个字符串,应设置为 一个字符串,包含要使用的摘要函数的名称: (可选)是一个 对于 一个字符串,应根据所使用的算法设置为 一个 一个布尔值,指示是否可以导出密钥。 一个 用于加密消息的密钥。 用于解密消息的密钥。 用于签名消息的密钥。 用于验证签名的密钥。 用于派生新密钥的密钥。 用于派生比特的密钥。 用于包装密钥的密钥。 用于解包密钥的密钥。 生成给定数据的摘要。接受要使用的摘要算法的标识符和要摘要的数据作为参数。返回一个 一个字符串,定义要使用的哈希函数: 一个 导出密钥:将密钥作为 一个字符串,描述应导出密钥的数据格式,可以是以下值: 原始数据格式。 对于 字符串,应设置为 字符串,包含要使用的摘要函数的名称:可以是 (可选)是一个 对于 字符串,应根据所使用的算法设置为 一个 布尔值,指示是否可以导出密钥。 一个 用于加密消息的密钥。 用于解密消息的密钥。 用于签名消息的密钥。 用于验证签名的密钥。 用于派生新密钥的密钥。 用于派生比特的密钥。 用于包装密钥的密钥。 用于解包密钥的密钥。 生成给定数据的摘要。接受要使用的摘要算法的标识符和要摘要的数据作为参数。返回一个 定义要使用的哈希函数的字符串:可以是 包含要摘要的数据的 导出密钥:接受一个密钥作为 描述密钥应以何种数据格式导出的字符串,可以是以下值: 原始数据格式。 PKCS #8 格式。 JSON Web Key (JWK) 格式(自 0.7.10 起)。 包含要导出的密钥的 为对称算法生成新密钥或为公钥算法生成密钥对(自 0.7.10 起)。返回一个 一个字典对象,定义要生成的密钥类型并提供额外的特定于算法的参数: 对于 字符串,应根据所使用的算法设置为 字符串,表示要使用的 对于 字符串,应设置为 字符串,表示要使用的椭圆曲线的名称,可以是 对于 字符串,应设置为 字符串,表示要使用的 (可选)是一个数字,表示密钥的比特长度。如果省略,密钥的长度等于所选摘要函数生成的摘要的长度。 对于 对于 字符串,应设置为 字符串,表示要使用的椭圆曲线的名称,可以是 布尔值,指示是否可以导出密钥。 一个 用于加密消息的密钥。 用于解密消息的密钥。 用于签名消息的密钥。 用于验证签名的密钥。 用于派生新密钥的密钥。 用于派生比特的密钥。 用于包装密钥的密钥。 用于解包密钥的密钥。 导入密钥:接受外部可移植格式的密钥作为输入,并返回一个 描述要导入的密钥的数据格式的字符串,可以是以下值: 原始数据格式。 PKCS #8 格式。 JSON Web Key (JWK) 格式(自 0.7.10 起)。 包含给定格式密钥的 定义要导入的密钥类型并提供额外的算法特定参数的字典对象: 对于 字符串,应根据所使用的算法设置为 字符串,表示要使用的 对于 字符串,应设置为 字符串,表示要使用的椭圆曲线的名称,可以是 对于 字符串,应设置为 字符串,表示要使用的 (可选)是一个数字,表示密钥的比特长度。如果省略,密钥的长度等于所选摘要函数生成的摘要的长度。 对于 对于 对于 对于 字符串,应设置为 字符串,表示要使用的椭圆曲线的名称,可以是 布尔值,指示是否可以导出密钥。 一个 用于加密消息的密钥。 用于解密消息的密钥。 用于签名消息的密钥。 用于验证签名的密钥。 用于派生新密钥的密钥。 用于派生比特的密钥。 用于包装密钥的密钥。 用于解包密钥的密钥。 返回 指定要使用的签名算法及其参数的字符串或对象: 对于 对于 字符串,应设置为 长整型 对于 字符串,应设置为 要使用的摘要算法的标识符,可以是 对于 包含用于签名的密钥的 包含要签名的数据的 验证数字签名;返回一个 指定要使用的算法及其参数的字符串或对象: 对于 对于 字符串,应设置为 长整型 对于 字符串,应设置为 要使用的摘要算法的标识符,可以是 对于 包含用于验证的密钥的 包含要验证的签名的 包含要验证其签名的数据的 返回一个对象,描述此密钥可用于的算法以及任何相关的额外参数(自 0.8.0 起),只读。 布尔值,如果密钥可以导出则为 字符串值,指示对象表示的密钥类型,只读。可能的值: 此密钥是用于对称算法的秘密密钥。 此密钥是非对称算法 此密钥是非对称算法 字符串数组,指示此密钥可用于什么用途(自 0.8.0 起),只读。可能的数组值: 用于加密消息的密钥。 用于解密消息的密钥。 用于签名消息的密钥。 用于验证签名的密钥。 用于派生新密钥的密钥。 用于派生比特的密钥。 表示私钥的 表示公钥的 返回包含当前 NJS 版本的字符串(例如,"0.7.4")。 返回包含当前 NJS 版本的数字。例如,"0.7.4" 返回为 返回值的美化打印字符串表示。 包含当前 VM 实例内存统计信息的对象(自 0.7.8 起)。 NJS 内存池从操作系统申请的内存量(以字节为单位)。 为指定的 VM 事件注册回调(自 0.5.2 起)。事件可以是以下字符串之一: 在 VM 销毁之前调用。回调不带参数调用。 返回包含启动当前进程时传递的命令行参数的数组。 返回包含用户环境的对象。 备注 默认情况下,Angie 会删除从其父进程继承的所有环境变量,但 TZ 变量除外。使用 向由 返回当前进程的 PID。 返回当前父进程的 PID。 默认情况下,NJS 中的所有字符串都是 Unicode 字符串。它们对应于包含 Unicode 字符的 ECMAScript 字符串。在 0.8.0 之前,还支持字节字符串。 备注 自 0.8.0 起,已移除对字节字符串和字节字符串方法的支持。在处理字节序列时,应使用 Buffer 对象和 Buffer 属性,例如 字节字符串包含字节序列,用于将 Unicode 字符串序列化为外部数据以及从外部源反序列化。例如,:samp:toUTF8() 方法使用 UTF-8 编码将 Unicode 字符串序列化为字节字符串。 以下方法已过时并在 0.8.0 中移除: 为指定的 布尔标志,指示当发现编码错误时 返回包含 布尔标志,如果错误模式是致命的则为 布尔标志,如果忽略字节顺序标记则为 返回包含由 布尔标志,指示后续调用 示例: 返回新构造的 将 将 从源 目标 取消由 在指定的 示例: 解码使用 类似的 示例: 从二进制字符串创建 Base64 编码的 ASCII 字符串。 该方法可用于编码可能导致通信问题的数据,传输它,然后使用 示例: 有关 Buffer 方法的详细文档,请参阅 Node.js Buffer 文档。 Crypto 模块提供加密功能支持。Crypto 模块对象使用 备注 自 0.7.0 起,扩展的 crypto API 可作为全局 crypto 对象使用。 创建并返回一个 Hash 对象,可使用给定的 创建并返回一个 HMAC 对象,使用给定的 使用给定的 计算使用 备注 在 0.4.4 版本之前,返回的是字节字符串而不是 Buffer 对象。 复制哈希的当前状态(自 0.7.12 起)。 示例: 使用给定的 计算使用 备注 在 0.4.4 版本之前,返回的是字节字符串而不是 Buffer 对象。 有关 fs 方法的详细文档,请参阅 Node.js fs 文档。 Query String 模块提供解析和格式化 URL 查询字符串的方法。模块对象使用 以针对 URL 查询字符串要求优化的方式对 将 解码查询字符串中百分号编码字符时使用的函数,默认值: 要解析的最大键数,默认值: 示例: 通过迭代 将查询字符串中的 URL 不安全字符转换为百分号编码时使用的函数,默认值: 示例: 对 XML 模块允许处理 XML 文档(自 0.7.10 起)。XML 模块对象使用 示例: 解析字符串或 Buffer 中的 XML 文档;返回一个表示已解析 XML 文档的 根据 规范 XML 版本 1.1 规范化 允许从输出中省略文档的一部分。 根据 独占 XML 规范化版本 1.0 规范化 围绕 XML 结构的 允许从输出中省略与该节点及其子节点对应的文档部分。 布尔值,默认为 可选字符串,包含以空格分隔的命名空间前缀,这些命名空间也应包含在输出中。 与 与 围绕 XML 结构的 XMLDoc 包装对象,文档的根节点。 按名称获取文档的根节点,如果不存在则为 undefined。 名为 围绕 XML 标签节点的 XMLNode 包装对象。 与 节点的 与 节点所有属性的 节点的名称。 节点的命名空间。 当前节点的父节点。 节点名为 所有子标签的数组。 与 节点所有名为 节点的内容,自 0.7.11 起可写。 与 将 XMLNode 作为子节点添加到该节点(自 0.7.11 起)。 删除节点的所有属性(自 0.7.11 起)。 删除名为 删除所有名为 删除节点的文本值(0.7.11)。 为 为节点设置文本值(自 0.7.11 起)。当值为 围绕 XML 节点属性的 XMLAttrs 包装对象。 返回 zlib 常量字典。 使用 Deflate 算法压缩 使用 Deflate 算法压缩 使用 Deflate 算法解压缩 使用 Deflate 算法解压缩 压缩级别(默认值: 指定应为压缩状态分配多少内存(默认值: 调整压缩算法(默认值: 设置窗口大小(默认值: 包含预定义压缩字典的 Buffer。 布尔值,如果为 压缩的块大小(默认值: 示例:Angie 对象#
HTTP 请求#
r.args{}r.done()r.error()r.finish()r.headersIn{}r.headersOut{}r.httpVersionr.internalr.internalRedirect()r.log()r.methodr.parentr.remoteAddressr.requestBodyr.requestBufferr.requestTextr.rawHeadersIn[]r.rawHeadersOut[]r.responseBodyr.responseBufferr.responseTextr.return()r.send()r.sendBuffer()r.sendHeader()r.setReturnValue()r.statusr.subrequest()r.urir.rawVariables{}r.variables{}r.warn()r.args{}a=1&b=%32&A=3&b=4&B=two%20words
r.args:{a: "1", b: ["2", "4"], A: "3", B: "two words"}
$args 变量来实现,例如:import qs from 'querystring';
function args(r) {
return qs.parse(r.variables.args);
}
r.args 时进行求值。如果只需要单个参数,例如 foo,可以使用 Angie 变量:r.variables.arg_foo
r.args 转换回字符串,可以使用 Query String 的 stringify 方法。r.done()js_body_filter (0.5.2)。只能从 js_body_filter 函数中调用。r.error(string)string 以 error 日志级别写入错误日志。r.finish()r.headersIn{}Foo 请求头:headersIn.foo 或 headersIn['Foo']。Authorization、Content-Length、Content-Range、Content-Type、ETag、Expect、From、Host、If-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since、Max-Forwards、Proxy-Authorization、Referer、Transfer-Encoding 和 User-Agent 请求头只能有一个字段值(0.4.1)。Cookie 头中的重复字段值用分号(;)分隔。所有其他请求头中的重复字段值用逗号分隔。r.headersOut{}r.headersOut{} 是子请求的响应对象,它表示响应头。在这种情况下,Accept-Ranges、Connection、Content-Disposition、Content-Encoding、Content-Length、Content-Range、Date、Keep-Alive、Server、Transfer-Encoding、X-Accel-* 响应头中的字段值可能会被省略。Foo 响应头:headersOut.foo 或 headersOut['Foo']。r.headersOut{} 在以下情况下有效可写:js_content 处理程序中,在调用 r.sendHeader() 或 r.return() 之前js_header_filter 处理程序中r.headersOut['Foo'] = ['a', 'b']
Foo: a
Foo: b
Foo 响应头的所有先前字段值将被删除。Content-Type),只有数组的最后一个元素会生效。Set-Cookie 响应头的字段值始终以数组形式返回。Age、Content-Encoding、Content-Length、Content-Type、ETag、Expires、Last-Modified、Location、Retry-After 响应头中的重复字段值会被忽略。所有其他响应头中的重复字段值用逗号分隔。r.httpVersionr.internaltrue。r.internalRedirect(uri)uri 的内部重定向。如果 URI 以 @ 前缀开头,则被视为命名 location。在新 location 中,所有请求处理从普通 location 的 NGX_HTTP_SERVER_REWRITE_PHASE 开始重复,从命名 location 的 NGX_HTTP_REWRITE_PHASE 开始重复。因此,重定向到命名 location 不会检查 client_max_body_size 限制。重定向的请求变为内部请求,可以访问内部 location。实际的重定向发生在处理程序执行完成后。js_var 指令为 HTTP 或 Stream 声明的变量。r.log(string)string 以 info 日志级别写入错误日志。r.methodr.parentr.remoteAddressr.requestBodyr.requestBuffer 或 r.requestText 属性代替。r.requestBufferclient_max_body_size 限制,并且应使用 client_body_buffer_size 设置足够的缓冲区大小。该属性仅在 js_content 指令中可用。r.requestTextr.requestBuffer 相同,但返回一个字符串。注意,它可能会将 UTF-8 编码中无效的字节转换为替换字符。r.rawHeadersIn[]Host: localhost
Foo: bar
foo: bar2
r.rawHeadersIn 的输出将是:[
['Host', 'localhost'],
['Foo', 'bar'],
['foo', 'bar2']
]
foo 头:r.rawHeadersIn.filter(v=>v[0].toLowerCase() == 'foo').map(v=>v[1])
['bar', 'bar2']
r.rawHeadersOut[]r.responseBodyr.responseBuffer 或 r.responseText 属性代替。r.responseBufferr.responseBuffer 的大小受 subrequest_output_buffer_size 指令限制。r.responseTextr.responseBuffer 相同,但返回字符串(从 0.5.0 开始)。注意,它可能会将 UTF-8 编码中无效的字节转换为替换字符。r.return(status[, string | Buffer])status 的完整响应。响应可以是字符串或 Buffer(0.5.0)。r.send(string | Buffer)r.sendBuffer(data[, options])options 是一个对象,用于覆盖从传入数据块缓冲区派生的 Angie 缓冲区标志。可以使用以下标志覆盖这些标志:lasttrue 表示该缓冲区是最后一个缓冲区。flushtrue 表示该缓冲区应具有 flush 标志。js_body_filter 函数中调用。r.sendHeader()r.setReturnValue(value)js_set 处理程序的返回值(0.7.0)。与普通的 return 语句不同,当处理程序是 JS 异步函数时应使用此方法。例如:async function js_set(r) {
const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
r.setReturnValue(digest);
}
r.statusr.subrequest(uri[, options[, callback]])uri 和 options 创建子请求,并安装可选的完成 callback。proxy_set_header 指令。要向代理服务器发送全新的标头集,可以使用 proxy_pass_request_headers 指令。options 是字符串,则它保存子请求参数字符串。否则,:samp:options 应为具有以下键的对象:argsbodymethodGET 方法。detachedtrue,则创建的子请求是分离的子请求。对分离子请求的响应将被忽略。与普通子请求不同,分离的子请求可以在变量处理程序内创建。detached 标志和 callback 参数是互斥的。callback 接收一个子请求响应对象,其方法和属性与父请求对象相同。callback,则返回解析为子请求响应对象的 Promise 对象。async function handler(r) {
const reply = await r.subrequest('/path');
for (const h in reply.headersOut) {
r.log(`${h}: ${reply.headersOut[h]}`);
}
r.return(200);
}
r.urir.rawVariables{}r.variables{}$foo 变量,可以使用以下语法之一:r.variables['foo']
r.variables.foo
r.variables['1']
r.variables[1]
angie.conf 中引用的变量和未引用的变量的处理方式不同。当变量被引用时,它可能是可缓存的,但当它未被引用时,它始终是不可缓存的。例如,当 $request_id 变量仅从 NJS 访问时,每次求值时它都有一个新值。但是,当 $request_id 被引用时,例如:proxy_set_header X-Request-Id $request_id;
r.variables.request_id 每次都返回相同的值。js_var 指令创建的(自 0.5.3 起)$http_)。r.warn(string)warning 日志级别将 string 写入错误日志。Stream 会话#
s.allow()s.decline()s.deny()s.done()s.error()s.log()s.off()s.on()s.remoteAddresss.rawVariables{}s.send()s.sendDownstream()s.sendUpstream()s.statuss.setReturnValue()s.variables{}s.warn()s.allow()s.done(0) 的别名(0.2.4)。s.decline()s.done(-5) 的别名(0.2.4)。s.deny()s.done(403) 的别名(0.2.4)。s.done([code])code 设置为代码值,默认为 0。实际的终结发生在 js 处理程序完成并且所有待处理事件(例如来自 ngx.fetch() 或 setTimeout() 的事件)都被处理之后(0.2.4)。0 — 成功终结,将控制权传递给下一个阶段-5 — 未决定,将控制权传递给当前阶段的下一个处理程序(如果有)403 — 访问被禁止js_access 或 js_preread。s.error(string)error 日志级别将发送的 string 写入错误日志。s.log(string)info 日志级别将发送的 string 写入错误日志。s.off(eventName)s.on() 方法设置的回调(0.2.4)。s.on(event, callback)event 注册 callback (0.2.4)。event 可以是以下字符串之一:uploaddownloadupstreamdownstreamcallback(data, flags),其中 data 是字符串或 Buffer(取决于事件类型);:samp:flags 是具有以下属性的对象:lasts.remoteAddresss.rawVariabless.send(data[, options])options 是一个对象,用于覆盖从传入数据块缓冲区派生的 Angie 缓冲区标志。可以使用以下标志覆盖这些标志:lastflushflush 标志。s.sendDownstream()s.send() 相同,但它始终将数据发送到客户端(自 0.7.8 起)。s.sendUpstream()s.send() 相同,但它始终从客户端发送数据(自 0.7.8 起)。s.statuss.setReturnValue(value)js_set 处理程序的返回值(0.7.0)。与普通的 return 语句不同,当处理程序是 JS 异步函数时应使用此方法。例如:async function js_set(r) {
const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
r.setReturnValue(digest);
}
s.variables{}s.warn(string)warning 日志级别将发送的 string 写入错误日志。周期会话#
PeriodicSession.rawVariables{}PeriodicSession.variables{}Periodic Session 对象作为 HTTP 和 Stream 的 js_periodic 处理程序的第一个参数提供(自 0.8.1 起)。PeriodicSession.rawVariables{}PeriodicSession.variables{}Headers#
Headers()Headers.append()Headers.delete()Headers.get()Headers.getAll()Headers.forEach()Headers.has()Headers.set()Headers 接口自 0.5.1 起可用。Headers() 构造函数创建新的 Headers 对象(自 0.7.10 起):Headers([init])initHeaders 对象的 HTTP 标头的对象,可以是 string、名称-值对的 array,或现有的 Headers 对象。Headers 对象:append()Headers 对象中的现有标头追加新值,如果标头不存在则添加该标头(自 0.7.10 起)。delete()Headers 对象中删除标头(自 0.7.10 起)。get()getAll(name)forEach()Headers 对象中的每个键/值对执行一次提供的函数(自 0.7.10 起)。has()set()Headers 对象内的现有标头设置新值,如果标头不存在则添加该标头(自 0.7.10 起)。Request#
Request()Request.arrayBuffer()Request.bodyUsedRequest.cacheRequest.credentialsRequest.headersRequest.json()Request.methodRequest.modeRequest.text()Request.urlRequest 接口自 0.7.10 起可用。Request() 构造函数创建新的 Request 对象:Request[resource[, options]])ngx.fetch() 的 Request 对象来获取。resource 可以是 URL 或现有的 Request 对象。options 是可选参数,应为具有以下键的对象:bodyheadersHeaders 对象的 HTTP 标头的对象,可以是 string、名称-值对的 array,或现有的 Headers 对象。methodRequest 对象:arrayBuffer()Promise,该 Promise 解析为 ArrayBuffer。bodyUsedtrue。cachecredentialssame-origin。headersRequest 关联的只读 Headers 对象。json()Promise,该 Promise 解析为将请求主体解析为 JSON 的结果。methodmodetext()Promise,该 Promise 解析为请求主体的字符串表示形式。urlResponse#
Response()Response.arrayBuffer()Response.bodyUsedResponse.headersResponse.json()Response.okResponse.redirectedResponse.statusResponse.statusTextResponse.text()Response.typeResponse.urlResponse 接口自 0.5.1 起可用。Response() 构造函数创建新的 Response 对象(自 0.7.10 起):Response[body[, options]])Response 对象。body 是可选参数,可以是 string 或 buffer,默认为 null。options 是可选参数,应为具有以下键的对象:headersHeaders 对象的 HTTP 标头的对象,可以是 string、名称-值对的 array,或现有的 Headers 对象。statusstatusTextResponse() 对象:arrayBuffer()Response 流并读取至完成。返回一个 Promise,该 Promise 解析为 ArrayBuffer。bodyUsedtrue。headersResponse 关联的只读 Headers 对象。json()Response 流并读取至完成。返回一个 Promise,该 Promise 解析为将主体文本解析为 JSON 的结果。oktrue。redirectedtrue。statusstatusTexttext()Response 流并读取至完成。返回一个 Promise,该 Promise 解析为字符串。typeurlngx#
ngx.buildngx.conf_file_pathngx.conf_prefixngx.error_log_pathngx.fetch()ngx.log()ngx.prefixngx.versionngx.version_numberngx.worker_idngx 全局对象自 0.5.0 起可用。ngx.build--build=name 参数,默认为 "" (0.8.0)。ngx.conf_file_pathngx.conf_prefixngx.error_log_pathngx.fetch(resource, [options])resource (0.5.1),可以是 URL 或 Request 对象(0.7.10)。返回一个 Promise,该 Promise 解析为 Response 对象。从 0.7.0 开始,支持 https:// 协议;不处理重定向。resource 中的 URL 指定为域名,则使用解析器进行解析。如果指定了 https:// 协议,则应配置 js_fetch_trusted_certificate 指令以对 resource 的 HTTPS 服务器进行身份验证。options 参数应为包含以下键的对象:bodybuffer_size4096。headersmax_response_body_size32768。methodGET 方法。verifytrue (0.7.0)。let reply = await ngx.fetch('http://example.com/');
let body = await reply.text();
r.return(200, body);
ngx.log(level, message)level 参数指定日志级别之一;:samp:message 参数可以是字符串或 Buffer。可以指定以下日志级别:ngx.INFO、ngx.WARN 和 ngx.ERR。ngx.prefixngx.version1.25.0 (0.8.0)。ngx.version_number1025000 (0.8.0)。ngx.worker_id0 和 worker_processes 指令中指定的值之间(0.8.0)。内置对象#
console#
console.error()console.info()console.log()console.time()console.timeEnd()console.warn()console 对象从 Angie 0.8.2 开始可用,从 CLI 0.2.6 开始可用。console.error(msg[, msg2 ...])console.info(msg[, msg2 ...])console.log(msg[, msg2 ...])console.time(label)label 参数允许命名不同的计时器。如果使用相同的名称调用 console.timeEnd(),则将输出自计时器启动以来经过的时间(以毫秒为单位)。console.timeEnd(label)console.time() 启动的计时器。label 参数允许命名不同的计时器。console.warn(msg[, msg2 ...])crypto#
crypto.getRandomValues()crypto.subtle.encrypt()crypto.subtle.decrypt()crypto.subtle.deriveBits()crypto.subtle.deriveKey()crypto.subtle.digest()crypto.subtle.exportKey()crypto.subtle.generateKey()crypto.subtle.importKey()crypto.subtle.sign()crypto.subtle.verify()crypto 对象是一个全局对象,允许使用加密功能(自 0.7.0 起)。crypto.getRandomValues(typedArray)typedArray 传递的同一数组,但其内容被替换为新生成的随机数。可能的值:typedArrayInt8Array、Int16Array、Uint16Array、Int32Array 或 Uint32Array。crypto.subtle.encrypt(algorithm, key, data)algorithm 和 key 加密 data。返回一个 Promise,该 Promise 将使用包含密文的 ArrayBuffer 来兑现。可能的值:algorithmRSA-OAEP,传递一个具有以下键的对象:nameRSA-OAEP:crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
AES-CTR,传递一个具有以下键的对象:nameAES-CTR。counterArrayBuffer、TypedArray 或 DataView — 计数器块的初始值,必须为 16 字节长(AES 块大小)。此块最右边的 length 位用于计数器,其余部分用于随机数。例如,如果 length 设置为 64,则 counter 的前半部分是随机数,后半部分用于计数器。lengthAES-CBC,传递一个具有以下键的对象:nameAES-CBC。ivArrayBuffer、TypedArray 或 DataView,必须为 16 字节,不可预测,最好是加密随机的。但是,它不需要保密,例如,它可以与密文一起未加密传输。AES-GCM,传递一个具有以下键的对象:nameAES-GCM。ivArrayBuffer、TypedArray 或 DataView,必须为 16 字节,并且对于使用给定密钥执行的每个加密操作必须是唯一的。additionalDataArrayBuffer、TypedArray 或 DataView,包含不会被加密但将与加密数据一起进行身份验证的附加数据。如果指定了 additionalData,则必须在相应的 decrypt() 调用中指定相同的数据:如果提供给 decrypt() 调用的数据与原始数据不匹配,解密将抛出异常。additionalData 的位长度必须小于 2^64 - 1。tagLength128) - 一个 number,确定在加密操作中生成的身份验证标签的位大小,并在相应的解密中用于身份验证。可能的值: 32、64、96、104、112、120 或 128。AES-GCM 规范建议应为 96、104、112、120 或 128,尽管在某些应用程序中 32 或 64 位可能是可接受的。keyCryptoKey,包含用于加密的密钥。dataArrayBuffer、TypedArray 或 DataView,包含要加密的数据(也称为明文)。crypto.subtle.decrypt(algorithm, key, data)Promise。可能的值:algorithmencrypt() 调用中的值匹配。RSA-OAEP,传递一个具有以下键的对象:nameRSA-OAEP:crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
AES-CTR,传递一个具有以下键的对象:nameAES-CTR。counterArrayBuffer、TypedArray 或 DataView — 计数器块的初始值,必须为 16 字节长(AES 块大小)。此块最右边的 length 位用于计数器,其余部分用于随机数。例如,如果 length 设置为 64,则 counter 的前半部分是随机数,后半部分用于计数器。lengthAES-CBC,传递一个具有以下键的对象:nameAES-CBC。ivArrayBuffer、TypedArray 或 DataView,必须为 16 字节,不可预测,最好是加密随机的。但是,它不需要保密(例如,它可以与密文一起未加密传输)。AES-GCM,传递一个具有以下键的对象:nameAES-GCM。ivArrayBuffer、TypedArray 或 DataView,必须为 16 字节,并且对于使用给定密钥执行的每个加密操作必须是唯一的。additionalDataArrayBuffer、TypedArray 或 DataView,包含不会被加密但将与加密数据一起进行身份验证的附加数据。如果指定了 additionalData,则必须在相应的 decrypt() 调用中指定相同的数据:如果提供给 decrypt() 调用的数据与原始数据不匹配,解密将抛出异常。additionalData 的位长度必须小于 2^64 - 1。tagLength128) - 一个 number,确定在加密操作中生成的身份验证标签的位大小,并在相应的解密中用于身份验证。可能的值: 32、64、96、104、112、120 或 128。AES-GCM 规范建议应为 96、104、112、120 或 128,尽管在某些应用程序中 32 或 64 位可能是可接受的。keyCryptoKey,包含用于解密的密钥。如果使用 RSA-OAEP,这是 CryptoKeyPair 对象的 privateKey 属性。dataArrayBuffer、TypedArray 或 DataView,包含要解密的数据(也称为密文)。crypto.subtle.deriveBits(algorithm, baseKey, length)Promise,该 Promise 将使用包含派生位的 ArrayBuffer 来兑现。可能的值:algorithmHKDF,传递一个具有以下键的对象:nameHKDF。hashSHA-1、SHA-256、SHA-384 或 SHA-512。saltArrayBuffer、TypedArray 或 DataView,表示与 digest 函数的输出长度相同的随机或伪随机值。与传递到 deriveKey() 中的输入密钥材料不同,salt 不需要保密。infoArrayBuffer、TypedArray 或 DataView,表示特定于应用程序的上下文信息,用于将派生密钥绑定到应用程序或上下文,并允许在使用相同输入密钥材料的同时为不同上下文派生不同的密钥。此属性是必需的,但可以是空缓冲区。PBKDF2,传递一个具有以下键的对象:namePBKDF2。hashSHA-1、SHA-256、SHA-384 或 SHA-512。saltArrayBuffer、TypedArray 或 DataView,表示至少 16 字节的随机或伪随机值。与传递到 deriveKey() 中的输入密钥材料不同,salt 不需要保密。iterationsnumber,表示在 deriveKey() 中哈希函数将被执行的次数。ECDH,传递具有以下键的对象(自 0.9.1 起):nameECDH。publicCryptoKey,表示另一方的公钥。该密钥必须使用与基础密钥相同的曲线生成。baseKeyCryptoKey,表示派生算法的输入 - 派生函数的初始密钥材料:例如,对于 PBKDF2,它可能是一个密码,使用 crypto.subtle.importKey() 作为 CryptoKey 导入。length8 的倍数。crypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)algorithmHKDF,传递具有以下键的对象:nameHKDF。hashSHA-1、SHA-256、SHA-384 或 SHA-512。saltArrayBuffer、TypedArray 或 DataView,表示与 digest 函数输出长度相同的随机或伪随机值。与传递给 deriveKey() 的输入密钥材料不同,盐不需要保密。infoArrayBuffer、TypedArray 或 DataView,表示特定于应用程序的上下文信息,用于将派生密钥绑定到应用程序或上下文,并允许在使用相同输入密钥材料的同时为不同上下文派生不同的密钥。此属性是必需的,但可以是空缓冲区。PBKDF2,传递具有以下键的对象:namePBKDF2。hashSHA-1、SHA-256、SHA-384 或 SHA-512。saltArrayBuffer、TypedArray 或 DataView,表示至少 16 字节的随机或伪随机值。与传递给 deriveKey() 的输入密钥材料不同,盐不需要保密。iterationsnumber,表示在 deriveKey() 中哈希函数将被执行的次数。ECDH,传递具有以下键的对象(自 0.9.1 起):nameECDH。publicKeyCryptoKey,表示另一方的公钥。该密钥必须使用与基础密钥相同的曲线生成。baseKeyCryptoKey,表示派生算法的输入 - 派生函数的初始密钥材料:例如,对于 PBKDF2,它可能是一个密码,使用 crypto.subtle.importKey() 作为 CryptoKey 导入。derivedKeyAlgorithmHMAC,传递具有以下键的对象:nameHMAC。hashSHA-1、SHA-256、SHA-384 或 SHA-512。lengthnumber,表示密钥的比特长度。如果未指定,密钥的长度等于所选哈希函数的块大小。AES-CTR、AES-CBC 或 AES-GCM,传递具有以下键的对象:nameAES-CTR、AES-CBC 或 AES-GCM。lengthnumber,表示要生成的密钥的比特长度: 128、192 或 256。extractablekeyUsagesArray,指示可以对派生密钥执行的操作。密钥用途必须被 derivedKeyAlgorithm 中设置的算法所允许。可能的值:encryptdecryptsignverifyderiveKeyderiveBitswrapKeyunwrapKeycrypto.subtle.digest(algorithm, data)Promise,该 Promise 将使用摘要来完成。可能的值:algorithmSHA-1 (不用于加密应用程序)、SHA-256、SHA-384 或 SHA-512。dataArrayBuffer、TypedArray 或 DataView,包含要摘要的数据。crypto.subtle.exportKey(format, key)CryptoKey 对象,并以外部可移植格式返回密钥(自 0.7.10 起)。如果 format 是 jwk,则 Promise 使用包含密钥的 JSON 对象来完成。否则,promise 使用包含密钥的 ArrayBuffer 来完成。可能的值:formatrawHMAC,传递具有以下键的对象:nameHMAC。hashSHA-1、SHA-256、SHA-384 或 SHA-512。lengthnumber,表示密钥的比特长度。如果未指定,密钥的长度等于所选哈希函数的块大小。AES-CTR、AES-CBC 或 AES-GCM,传递具有以下键的对象:nameAES-CTR、AES-CBC 或 AES-GCM。lengthnumber,表示要生成的密钥的比特长度:可以是 128、192 或 256。extractablekeyUsagesArray,指示派生密钥可以执行的操作。密钥用途必须被 derivedKeyAlgorithm 中设置的算法所允许。可能的值:encryptdecryptsignverifyderiveKeyderiveBitswrapKeyunwrapKeycrypto.subtle.digest(algorithm, data)Promise,该 Promise 以摘要来兑现。可能的值:algorithmSHA-1 (不用于加密应用)、SHA-256、SHA-384 或 SHA-512。dataArrayBuffer、TypedArray 或 DataView。crypto.subtle.exportKey(format, key)CryptoKey 对象,并以外部可移植格式返回密钥(自 0.7.10 起)。如果 format 是 jwk,则 Promise 以包含密钥的 JSON 对象来兑现。否则,Promise 以包含密钥的 ArrayBuffer 来兑现。可能的值:formatrawpkcs8spkijwkkeyCryptoKey。crypto.subtle.generateKey(algorithm, extractable, usage)Promise,该 Promise 以生成的密钥作为 CryptoKey 或 CryptoKeyPair 对象来兑现。可能的值:algorithmRSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP,传递具有以下键的对象:nameRSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP。hashdigest 函数的名称,可以是 SHA-256、SHA-384 或 SHA-512。ECDSA,传递具有以下键的对象:nameECDSA。namedCurveP-256、P-384 或 P-521。HMAC,传递具有以下键的对象:nameHMAC。hashdigest 函数的名称,可以是 SHA-256、SHA-384 或 SHA-512。lengthAES-CTR、AES-CBC 或 AES-GCM,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象,其中 ALGORITHM 是算法的名称。ECDH,传递具有以下键的对象(自 0.9.1 起):nameECDH。namedCurveP-256、P-384 或 P-521。extractableusagearray,指示密钥的可能操作:encryptdecryptsignverifyderiveKeyderiveBitswrapKeyunwrapKeycrypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages)CryptoKey 对象。返回一个 Promise,该 Promise 以导入的密钥作为 CryptoKey 对象来兑现。可能的值:formatrawpkcs8spkijwkkeyDataArrayBuffer、TypedArray 或 DataView 对象。algorithmRSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP,传递具有以下键的对象:nameRSASSA-PKCS1-v1_5、RSA-PSS 或 RSA-OAEP。hashdigest 函数的名称,可以是 SHA-1、SHA-256、SHA-384 或 SHA-512。ECDSA,传递具有以下键的对象:nameECDSA。namedCurveP-256、P-384 或 P-521。HMAC,传递具有以下键的对象:nameHMAC。hashdigest 函数的名称,可以是 SHA-256、SHA-384 或 SHA-512。lengthAES-CTR、AES-CBC 或 AES-GCM,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象,其中 ALGORITHM 是算法的名称。PBKDF2,传递 PBKDF2 字符串。HKDF,传递 HKDF 字符串。ECDH,传递具有以下键的对象(自 0.9.1 起):nameECDH。namedCurveP-256、P-384 或 P-521。extractablekeyUsagesarray,指示密钥的可能操作:encryptdecryptsignverifyderiveKeyderiveBitswrapKeyunwrapKeycrypto.subtle.sign(algorithm, key, data)signature 作为 Promise,该 Promise 以包含签名的 ArrayBuffer 来兑现。可能的值:algorithmRSASSA-PKCS1-v1_5,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象。RSA-PSS,传递具有以下键的对象:nameRSA-PSS。saltLengthinteger,表示要使用的随机盐的长度(以字节为单位)。ECDSA,传递具有以下键的对象:nameECDSA。hashSHA-256、SHA-384 或 SHA-512。HMAC,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象。keyCryptoKey 对象。如果算法标识公钥密码系统,则这是私钥。dataArrayBuffer、TypedArray 或 DataView 对象。crypto.subtle.verify(algorithm, key, signature, data)Promise,该 Promise 以布尔值兑现:如果签名有效则为 true,否则为 false。可能的值:algorithmRSASSA-PKCS1-v1_5,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象。RSA-PSS,传递具有以下键的对象:nameRSA-PSS。saltLengthinteger,表示要使用的随机盐的长度(以字节为单位)。ECDSA,传递具有以下键的对象:nameECDSA。hashSHA-256、SHA-384 或 SHA-512。HMAC,传递标识算法的字符串或形式为 "name": "ALGORITHM" 的对象。keyCryptoKey 对象。对于对称算法,它是密钥;对于公钥系统,它是公钥。signatureArrayBuffer、TypedArray 或 DataView。dataArrayBuffer、TypedArray 或 DataView 对象。CryptoKey#
CryptoKey.algorithmCryptoKey.extractableCryptoKey.typeCryptoKey.usagesCryptoKey 对象表示从 SubtleCrypto 方法之一获得的加密 key:crypto.subtle.generateKey()、crypto.subtle.deriveKey()、crypto.subtle.importKey()。CryptoKey.algorithmCryptoKey.extractabletrue (自 0.8.0 起),只读。CryptoKey.typesecretprivateCryptoKeyPair 的私钥部分。publicCryptoKeyPair 的公钥部分。CryptoKey.usagesencryptdecryptsignverifyderiveKeyderiveBitsCryptoKeyPair#
CryptoKeyPair.privateKeyCryptoKeyPair.publicKeyCryptoKeyPair 是 WebCrypto API 的字典对象,表示非对称密钥对。CryptoKeyPair.privateKeyCryptoKey 对象。CryptoKeyPair.publicKeyCryptoKey 对象。njs#
njs.versionnjs.version_numbernjs.dump()njs.memoryStatsnjs.on()njs 对象是表示当前 VM 实例的全局对象(自 0.2.0 起)。njs.versionnjs.version_number0x000704 (自 0.7.4 起)。njs.dump(value)njs.memoryStatssizenjs.on(event, callback)exitprocess#
process.argvprocess.envprocess.kill()process.pidprocess.ppidprocess 对象是提供有关当前进程信息的全局对象(0.3.3)。process.argvprocess.envenv 指令来保留一些继承的变量。process.kill(pid, number | string)pid 标识的进程发送信号。信号名称是数字或字符串,例如 SIGINT 或 SIGHUP。有关更多信息,请参阅 kill(2)。process.pidprocess.ppidString#
字节字符串(已移除)#
r.requestBuffer、r.rawVariables。toBytes() 方法将代码点最多为 255 的 Unicode 字符串序列化为字节字符串;否则返回 null。String.bytesFrom() (在 0.8.0 中移除,使用 Buffer.from())String.prototype.fromBytes() (在 0.8.0 中移除)String.prototype.fromUTF8() (在 0.8.0 中移除,使用 TextDecoder)String.prototype.toBytes() (在 0.8.0 中移除)String.prototype.toString() 带编码(在 0.8.0 中移除)String.prototype.toUTF8() (在 0.8.0 中移除,使用 TextEncoder)Web API#
TextDecoder#
TextDecoder()TextDecoder.prototype.encodingTextDecoder.prototype.fatalTextDecoder.prototype.ignoreBOMTextDecoder.prototype.decode()TextDecoder 从字节流生成代码点流(0.4.3)。TextDecoder([[encoding], options])encoding 创建新的 TextDecoder 对象;目前仅支持 UTF-8。options 是具有以下属性的 TextDecoderOptions 字典:fatalTextDecoder.decode() 是否必须抛出 TypeError 异常,默认为 false。TextDecoder.prototype.encodingTextDecoder() 使用的编码名称的字符串,只读。TextDecoder.prototype.fataltrue,只读。TextDecoder.prototype.ignoreBOMtrue,只读。TextDecoder.prototype.decode(buffer, [options])TextDecoder() 从 buffer 解码的文本的字符串。缓冲区可以是 ArrayBuffer。options 是具有以下属性的 TextDecodeOptions 字典:streamdecode() 时是否会有额外数据:如果分块处理数据则为 true,如果是最后一块或数据未分块则为 false。默认为 false。>> (new TextDecoder()).decode(new Uint8Array([206,177,206,178]))
αβ
TextEncoder#
TextEncoder()TextEncoder.prototype.encode()TextEncoder.prototype.encodeInto()TextEncoder 对象从代码点流生成 UTF-8 编码的字节流(0.4.3)。TextEncoder()TextEncoder,它将生成 UTF-8 编码的字节流。TextEncoder.prototype.encode(string)string 编码为包含 UTF-8 编码文本的 Uint8Array。TextEncoder.prototype.encodeInto(string, uint8Array)string 编码为 UTF-8,将结果放入目标 Uint8Array,并返回显示编码进度的字典对象。字典对象包含两个成员:readstring 转换为 UTF-8 的 UTF-16 代码单元数。writtenUint8Array 中修改的字节数。定时器#
clearTimeout()setTimeout()clearTimeout(timeout)setTimeout() 创建的 timeout 对象。setTimeout(function, milliseconds[, argument1, argumentN])milliseconds 毫秒数后调用 function。可以向指定的函数传递一个或多个可选 arguments。返回 timeout 对象。function handler(v)
{
// ...
}
t = setTimeout(handler, 12);
// ...
clearTimeout(t);
全局函数#
atob()btoa()atob(encodedData)Base64 编码的数据字符串。encodedData 参数是包含 Base64 编码数据的二进制字符串。返回包含从 encodedData 解码的数据的字符串。btoa() 方法可用于编码和传输可能导致通信问题的数据,然后传输它并使用 atob() 方法再次解码数据。例如,您可以编码、传输和解码控制字符,如 ASCII 值 0 到 31。const encodedData = btoa("text to encode"); // 编码字符串
const decodedData = atob(encodedData); // 解码字符串
btoa(stringToEncode)stringToEncode 参数是要编码的二进制字符串。返回包含 stringToEncode 的 Base64 表示的 ASCII 字符串。atob() 方法再次解码数据。例如,您可以编码控制字符,如 ASCII 值 0 到 31。const encodedData = btoa("text to encode"); // 编码字符串
const decodedData = atob(encodedData); // 解码字符串
内置模块#
Buffer#
Buffer 对象是处理二进制数据的 Node.js 兼容方式。由于文件内容过于庞大,本节仅限于 Buffer 方法的完整列表。Buffer.alloc()Buffer.allocUnsafe()Buffer.byteLength()Buffer.compare()Buffer.concat()Buffer.from(array)Buffer.from(arrayBuffer)Buffer.from(buffer)Buffer.from(object)Buffer.from(string)Buffer.isBuffer()Buffer.isEncoding()buffer[]buf.bufferbuf.byteOffsetbuf.compare()buf.copy()buf.equals()buf.fill()buf.includes()buf.indexOf()buf.lastIndexOf()buf.lengthbuf.readIntBE()buf.readIntLE()buf.readUIntBE()buf.readUIntLE()buf.readDoubleBE()buf.readDoubleLE()buf.readFloatBE()buf.readFloatLE()buf.subarray()buf.slice()buf.swap16()buf.swap32()buf.swap64()buf.toJSON()buf.toString()buf.write()buf.writeIntBE()buf.writeIntLE()buf.writeUIntBE()buf.writeUIntLE()buf.writeDoubleBE()buf.writeDoubleLE()buf.writeFloatBE()buf.writeFloatLE()Crypto#
import crypto from 'crypto' 导入。crypto.createHash()crypto.createHmac()crypto.createHash(algorithm)algorithm 生成哈希摘要。算法可以是 md5、sha1 和 sha256。crypto.createHmac(algorithm, secret key)algorithm 和 secret key。算法可以是 md5、sha1 和 sha256。Hash#
hash.update()hash.digest()hash.update(data)data 更新哈希内容。hash.digest([encoding])hash.update() 传递的所有数据的摘要。编码可以是 hex、base64 和 base64url。如果未提供编码,则返回 Buffer 对象(0.4.4)。hash.copy()import crypto from 'crypto';
crypto.createHash('sha1').update('A').update('B').digest('base64url');
/* BtlFlCqiamG-GMPiK_GbvKjdK10 */
HMAC#
hmac.update()hmac.digest()hmac.update(data)data 更新 HMAC 内容。hmac.digest([encoding])hmac.update() 传递的所有数据的 HMAC 摘要。编码可以是 hex、base64 和 base64url。如果未提供编码,则返回 Buffer 对象(0.4.4)。fs#
fs 模块提供文件系统操作。模块对象使用 import fs from 'fs' 导入。fs.accessSync()fs.appendFileSync()fs.mkdirSync()fs.readdirSync()fs.readFileSync()fs.realpathSync()fs.renameSync()fs.rmdirSync()fs.symlinkSync()fs.unlinkSync()fs.writeFileSync()fs.promises.readFile()fs.promises.appendFile()fs.promises.writeFile()fs.promises.readdir()fs.promises.mkdir()fs.promises.rmdir()fs.promises.rename()fs.promises.unlink()fs.promises.symlink()fs.promises.access()fs.promises.realpath()Query String#
import qs from 'querystring' 导入。querystring.decode()querystring.encode()querystring.escape()querystring.parse()querystring.stringify()querystring.unescape()querystring.decode()querystring.parse() 的别名。querystring.encode()querystring.stringify() 的别名。querystring.escape(string)string 执行 URL 百分号编码。该方法由 querystring.stringify() 使用,不应直接使用。querystring.parse(string[, separator[, equal[, options]]])string 解析为 URL 查询字符串并返回一个对象。可选的 separator 参数(默认值: &)指定用于分隔键值对的子字符串。可选的 equal 参数(默认值: =)指定用于分隔键和值的子字符串。可选的 options 参数是一个对象,可能包含以下属性:decodeURIComponentquerystring.unescape()。maxKeys1000。值 0 会移除对键计数的限制。>> qs.parse('foo=bar&abc=xyz&abc=123')
{
foo: 'bar',
abc: ['xyz', '123']
}
querystring.stringify(object[, separator[, equal[, options]]])object 的自有属性从中生成 URL 查询字符串。可选的 separator 参数(默认值: &)指定用于分隔键值对的子字符串。可选的 equal 参数(默认值: =)指定用于分隔键和值的子字符串。可选的 options 参数是一个对象,可能包含以下属性:encodeURIComponentquerystring.escape()。>> qs.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' })
'foo=bar&baz=qux&baz=quux&corge='
querystring.unescape(string)string 中的 URL 百分号编码字符执行解码。该方法由 querystring.parse() 使用,不应直接使用。XML#
xml.parse()xml.c14n()xml.exclusiveC14n()xml.serialize()xml.serializeToString()XMLDocXMLNodeXMLAttrimport xml from 'xml' 导入。import xml from 'xml';
let data = `<note><to b="bar" a= "foo" >Tove</to><from>Jani</from></note>`;
let doc = xml.parse(data);
console.log(doc.note.to.$text) /* 'Tove' */
console.log(doc.note.to.$attr$b) /* 'bar' */
console.log(doc.note.$tags[1].$text) /* 'Jani' */
let dec = new TextDecoder();
let c14n = dec.decode(xml.exclusiveC14n(doc.note));
console.log(c14n) /* '<note><to a="foo" b="bar">Tove</to><from>Jani</from></note>' */
c14n = dec.decode(xml.exclusiveC14n(doc.note.to));
console.log(c14n) /* '<to a="foo" b="bar">Tove</to>' */
c14n = dec.decode(xml.exclusiveC14n(doc.note, doc.note.to /* excluding 'to' */));
console.log(c14n) /* '<note><from>Jani</from></note>' */
parse(string | Buffer)XMLDoc 包装对象。c14n(root_node[, excluding_node])root_node 及其子节点。root_node 可以是围绕 XML 结构的 XMLNode 或 XMLDoc 包装对象。返回包含规范化输出的 Buffer 对象。excluding_nodeexclusiveC14n(root_node[, excluding_node[, withComments[,prefix_list]]])root_node 及其子节点。root_nodeXMLNode 或 XMLDoc 包装对象。excluding_nodewithCommentsfalse。如果为 true,规范化对应于 带注释的独占 XML 规范化版本 1.0。返回包含规范化输出的 Buffer 对象。prefix_listserialize()xml.c14n() 相同(自 0.7.11 起)。serializeToString()xml.c14n() 相同,但以 string 形式返回结果(自 0.7.11 起)。XMLDocdoc.$rootdoc.abcabc 的第一个根标签,作为 XMLNode 包装对象。XMLNodenode.abcnode.$tag$abc 相同。node.$attr$abcabc 属性值,自 0.7.11 起可写。node.$attr$abc=xyznode.setAttribute('abc', xyz) 相同(自 0.7.11 起)。node.$attrsXMLAttr 包装对象。node.$namenode.$nsnode.$parentnode.$tag$abcabc 的第一个子标签,自 0.7.11 起可写。node.$tagsnode.$tags = [node1, node2, ...]node.removeChildren(); node.addChild(node1); node.addChild(node2) 相同(自 0.7.11 起)。node.$tags$abcabc 的子标签,自 0.7.11 起可写。node.$textnode.$text = 'abc'node.setText('abc') 相同(自 0.7.11 起)。node.addChild(nd)nd 在添加到节点之前会被递归复制。node.removeAllAttributes()node.removeAttribute(attr_name)attr_name 的属性(自 0.7.11 起)。node.removeChildren(tag_name)tag_name 的子标签(自 0.7.11 起)。如果 tag_name 不存在,则删除所有子标签。node.removeText()node.setAttribute(attr_name, value)attr_name 设置值(自 0.7.11 起)。当值为 null 时,删除名为 attr_name 的属性。node.setText(value)null 时,删除节点的文本。XMLAttrattr.abcabc 的属性值。zlib#
zlib 模块(0.5.2)使用 zlib 提供压缩和解压缩功能。模块对象使用 import zlib from 'zlib' 导入。zlib.constantszlib.deflateRawSync()zlib.deflateSync()zlib.inflateRawSync()zlib.inflateSync()zlib.constantszlib.deflateRawSync(data[, options])data,不包含 zlib 头。zlib.deflateSync(data[, options])data。zlib.inflateRawSync(data[, options])data,不包含 zlib 头。zlib.inflateSync(data[, options])data。options 参数是一个对象,可能包含以下属性:levelzlib.constants.Z_DEFAULT_COMPRESSION)。memLevelzlib.constants.Z_DEFAULT_MEMLEVEL)。strategyzlib.constants.Z_DEFAULT_STRATEGY)。windowBitszlib.constants.Z_DEFAULT_WINDOWBITS)。dictionaryinfotrue,返回包含 buffer 和 engine 的对象。chunkSizezlib.constants.Z_DEFAULT_CHUNK)。import zlib from 'zlib';
const deflated = zlib.deflateSync('Hello World!');
const inflated = zlib.inflateSync(deflated);
console.log(inflated.toString()); // 'Hello World!'