参考

NGINX 对象
     HTTP 请求
     流会话
     周期性会话
     头部
     请求
     响应
     ngx
     ngx.shared
内建对象
     控制台
     crypto
     CryptoKey
     CryptoKeyPair
     njs
     process
     String
Web API
     Text Decoder
     Text Encoder
timers
     全局函数
内建模块
     Buffer
     Crypto
     File System
     Query String
     XML
     zlib

njs 提供了用于扩展 NGINX 功能的对象、方法和属性。

本参考文档仅包含 njs 特有的、不符合 ECMAScript 规范的属性、方法和模块。符合 ECMAScript 规范的 njs 属性和方法的定义可在 ECMAScript 规范中找到。所有 njs 属性和方法的列表可在 Compatibility 中找到。

NGINX 对象

HTTP 请求

r.args{}
r.done()
r.error()
r.finish()
r.headersIn{}
r.headersOut{}
r.httpVersion
r.internal
r.internalRedirect()
r.log()
r.method
r.parent
r.remoteAddress
r.requestBody
r.requestBuffer
r.requestText
r.rawHeadersIn[]
r.rawHeadersOut[]
r.responseBody
r.responseBuffer
r.responseText
r.return()
r.send()
r.sendBuffer()
r.sendHeader()
r.setReturnValue()
r.status
r.subrequest()
r.uri
r.rawVariables{}
r.variables{}
r.warn()

HTTP 请求对象仅在 ngx_http_js_module 模块中可用。在 0.8.5 之前,该对象的所有字符串属性都是 字节字符串

r.args{}
请求参数对象,只读。

查询字符串作为对象返回。从 0.7.6 版本起,重复的键作为数组返回,键区分大小写,键和值都经过百分号解码。

例如,查询字符串

'a=1&b=%32&A=3&b=4&B=two%20words'

转换为 r.args 后为

{a: "1", b: ["2", "4"], A: "3", B: "two words"}

更高级的解析场景可以使用 Query String 模块和 $args 变量来实现,例如

import qs from 'querystring';

function args(r) {
    return qs.parse(r.variables.args);
}

参数对象在首次访问 r.args 时进行评估。如果只需要单个参数,例如 foo,则可以使用 NGINX 变量

r.variables.arg_foo

在这里,NGINX 变量对象返回给定键的第一个值,不区分大小写,且未经百分号解码。

要将 r.args 转换回字符串,可以使用 Query String 的 stringify 方法。

r.done()
调用此函数后,后续数据块将直接传递给客户端,而不再调用 js_body_filter (0.5.2)。只能从 js_body_filter 函数中调用此函数
r.error(string)
string 写入错误日志的 error 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

r.finish()
完成向客户端发送响应
r.headersIn{}
传入的头部对象,只读。

Foo 请求头部可以通过以下语法访问:headersIn.fooheadersIn['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.fooheadersOut['Foo']

传出头部应该在向客户端发送响应头部之前设置,否则头部更新将被忽略。这意味着 r.headersOut{} 在以下情况是有效可写的:

多值响应头部 (0.4.0) 的字段值可以使用以下语法设置

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.httpVersion
HTTP 版本,只读
r.internal
布尔值,对于 内部位置为 true
r.internalRedirect(uri)
对指定的 uri 执行 内部重定向。如果 uri 以“@”前缀开头,则被视为命名位置。在新位置中,所有请求处理将从头开始重复,对于普通位置从 NGX_HTTP_SERVER_REWRITE_PHASE 开始,对于命名位置从 NGX_HTTP_REWRITE_PHASE 开始。因此,重定向到命名位置不会检查 client_max_body_size 限制。更多详细信息请参阅 开发指南。重定向的请求变为内部请求,可以访问 内部位置。实际的重定向发生在处理程序执行完成后。

重定向后,将在目标位置启动新的 njs VM,原始位置的 VM 将停止。NGINX 变量的值会被保留,可用于向目标位置传递信息。从 0.5.3 版本起,可以使用通过 httpstreamjs_var 指令声明的变量。

0.7.4 版本起,该方法接受转义的 URI。

r.log(string)
string 写入错误日志的 info 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

r.method
HTTP 方法,只读
r.parent
引用父请求对象
r.remoteAddress
客户端地址,只读
r.requestBody
该属性在 0.5.0 版本中已弃用,并在 0.8.0 版本中移除。应改用 r.requestBufferr.requestText 属性。
r.requestBuffer
客户端请求体(如果尚未写入临时文件)(自 0.5.0 版本起)。为确保客户端请求体在内存中,应通过 client_max_body_size 限制其大小,并使用 client_body_buffer_size 设置足够的缓冲区大小。此属性仅在 js_content 指令中可用。
r.requestText
r.requestBuffer 相同,但返回一个 string。请注意,它可能将 UTF-8 编码中无效的字节转换为替换字符。
r.rawHeadersIn[]
返回一个键值对数组,与其从客户端接收时的形式完全一致 (0.4.1)。

例如,使用以下请求头部

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[]
返回一个响应头部键值对数组 (0.4.1)。头部字段名不转换为小写,重复的字段值不合并。
r.responseBody
该属性在 0.5.0 版本中已弃用,并在 0.8.0 版本中移除。应改用 r.responseBufferr.responseText 属性。
r.responseBuffer
保存 子请求的响应体,只读 (自 0.5.0 版本起)。r.responseBuffer 的大小受 subrequest_output_buffer_size 指令限制。
r.responseText
r.responseBuffer 相同,但返回一个 string (自 0.5.0 版本起)。请注意,它可能将 UTF-8 编码中无效的字节转换为替换字符。
r.return(status[, string | Buffer])
向客户端发送带有指定 status 的完整响应。响应可以是 string 或 Buffer (0.5.0)。

可以将重定向 URL(对于代码 301、302、303、307 和 308)或响应正文文本(对于其他代码)指定为第二个参数

r.send(string | Buffer)
将响应正文的一部分发送给客户端。发送的数据可以是 string 或 Buffer (0.5.0)
r.sendBuffer(data[, options])
将 data 添加到数据块链中,以便转发到下一个 body filter (0.5.2)。实际转发发生在稍后,当当前链中的所有数据块都被处理完毕时。

data 可以是 string 或 Buffer。options 是一个用于覆盖从传入数据块缓冲区派生的 NGINX 缓冲区标志的对象。标志可以使用以下标志进行覆盖

last
布尔值,如果缓冲区是最后一个缓冲区则为 true
flush
布尔值,如果缓冲区应该具有 flush 标志则为 true

该方法只能从 js_body_filter 函数中调用。
r.sendHeader()
将 HTTP 头部发送给客户端
r.setReturnValue(value)
设置 js_set 处理器 (0.7.0) 的返回值。与普通的 return 语句不同,当处理器是 JS async 函数时,应使用此方法。例如
async function js_set(r) {
    const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
    r.setReturnValue(digest);
}
r.status
status,可写
r.subrequest(uri[, options[, callback]])
使用给定的 urioptions 创建一个子请求,并安装一个可选的完成 callback

子请求与其客户端请求共享输入头部。要向代理服务器发送与原始头部不同的头部,可以使用 proxy_set_header 指令。要向代理服务器发送一套全新的头部,可以使用 proxy_pass_request_headers 指令。

如果 options 是一个 string,则它保存子请求的参数字符串。否则,options 应该是一个具有以下键的对象

args
参数字符串,默认为空字符串
body
请求体,默认为父请求对象的请求体
method
HTTP 方法,默认为 GET 方法
detached
布尔标志 (0.3.9),如果 true,创建的子请求是分离的子请求。对分离子请求的响应将被忽略。与普通子请求不同,分离子请求可以在变量处理器中创建。detached 标志和 callback 参数互斥。

完成 callback 接收一个 子请求响应对象,其方法和属性与父请求对象相同。

0.3.8 版本起,如果没有提供 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.uri
请求中的当前 URI,已 规范化,只读
r.rawVariables{}
NGINX 变量作为 Buffers,可写 (自 0.5.0 版本起)
r.variables{}
NGINX 变量对象,可写 (自 0.2.8 版本起)。

例如,要获取 $foo 变量,可以使用以下任一语法

r.variables['foo']
r.variables.foo

0.8.6 版本起,可以使用以下语法访问正则表达式捕获

r.variables['1']
r.variables[1]

NGINX 对 nginx.conf 中引用的变量和未引用的变量处理方式不同。当变量被引用时,可能是可缓存的,但未引用时总是不可缓存的。例如,当 $request_id 变量仅从 njs 访问时,每次评估都会有一个新值。但是,当 $request_id 被引用时,例如

proxy_set_header X-Request-Id $request_id;

r.variables.request_id 每次都返回相同的值。

变量在以下情况下是可写的:

  • 它使用 httpstreamjs_var 指令创建 (自 0.5.3 版本起)
  • 它在 NGINX 配置文件中被引用

即便如此,一些内嵌变量仍然无法被赋值(例如,$http_)。

r.warn(string)
string 写入错误日志的 warning 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

流会话

s.allow()
s.decline()
s.deny()
s.done()
s.error()
s.log()
s.off()
s.on()
s.remoteAddress
s.rawVariables{}
s.send()
s.sendDownstream()
s.sendUpstream()
s.status
s.setReturnValue()
s.variables{}
s.warn()

流会话对象仅在 ngx_stream_js_module 模块中可用。在 0.8.5 之前,该对象的所有字符串属性都是 字节字符串

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)。

可能的 code 值

  • 0 — 成功终结,将控制权传递给下一阶段
  • -5 — 未决定,将控制权传递给当前阶段的下一个处理器(如果有)
  • 403 — 访问被禁止

只能从阶段处理函数中调用:js_accessjs_preread
s.error(string)
将发送的 string 写入错误日志的 error 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

s.log(string)
将发送的 string 写入错误日志的 info 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

s.off(eventName)
注销由 s.on() 方法设置的 callback (0.2.4)
s.on(event, callback)
为指定的 event 注册一个 callback (0.2.4)。

event 可以是以下字符串之一

upload
来自客户端的新数据 (string)
下载
发往客户端的新数据 (string)
upstream
来自客户端的新数据 (Buffer) (自 0.5.0 版本起)
downstream
发往客户端的新数据 (Buffer) (自 0.5.0 版本起)

完成 callback 的原型如下:callback(data, flags),其中 data 是 string 或 Buffer(取决于事件类型),flags 是一个包含以下属性的对象

last
布尔值,如果 data 是最后一个缓冲区则为 true。

s.remoteAddress
客户端地址,只读
s.rawVariables
NGINX 变量作为 Buffers,可写 (自 0.5.0 版本起)
s.send(data[, options])
将 data 添加到数据块链中,这些数据块将按转发方向传递:在下载 callback 中发往客户端;在上传 callback 中发往上游服务器 (0.2.4)。实际转发发生在稍后,当当前链中的所有数据块都被处理完毕时。

data 可以是 string 或 Buffer (0.5.0)。options 是一个用于覆盖从传入数据块缓冲区派生的 NGINX 缓冲区标志的对象。标志可以使用以下标志进行覆盖

last
布尔值,如果缓冲区是最后一个缓冲区则为 true
flush
布尔值,如果缓冲区应该具有 flush 标志则为 true

每个 callback 调用可以多次调用此方法。
s.sendDownstream()
s.send() 相同,但它总是将数据发送到客户端 (自 0.7.8 版本起)。
s.sendUpstream()
s.send() 相同,但它总是将数据从客户端发送出去 (自 0.7.8 版本起)。
s.status
会话状态码,$status 变量的别名,只读 (自 0.5.2 版本起)
s.setReturnValue(value)
设置 js_set 处理器 (0.7.0) 的返回值。与普通的 return 语句不同,当处理器是 JS async 函数时,应使用此方法。例如
async function js_set(r) {
    const digest = await crypto.subtle.digest('SHA-256', r.headersIn.host);
    r.setReturnValue(digest);
}
s.variables{}
NGINX 变量对象,可写 (自 0.2.8 版本起)。变量只有在 NGINX 配置文件中被引用时才能可写。即便如此,一些内嵌变量仍然无法被赋值。
s.warn(string)
将发送的 string 写入错误日志的 warning 级别

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

周期性会话

PeriodicSession.rawVariables{}
PeriodicSession.variables{}

Periodic Session 对象作为 httpstreamjs_periodic 处理器 (自 0.8.1 版本起) 的第一个参数提供。

PeriodicSession.rawVariables{}
NGINX 变量作为 Buffers,可写。
PeriodicSession.variables{}
NGINX 变量对象,可写。

头部

Headers()
Headers.append()
Headers.delete()
Headers.get()
Headers.getAll()
Headers.forEach()
Headers.has()
Headers.set()

Fetch APIHeaders 接口从 0.5.1 版本起可用。

可以使用 Headers() 构造函数创建新的 Headers 对象:(自 0.7.10 版本起)

Headers([init])
init
一个包含 HTTP 头部用于预填充 Headers 对象的对象,可以是 string、名称-值对 array,或现有的 Headers 对象。

可以使用以下属性和方法创建新的 Headers 对象

append()
Headers 对象中的现有头部添加一个新值,如果头部不存在则添加该头部 (自 0.7.10 版本起)。
delete()
Headers 对象中删除一个头部 (自 0.7.10 版本起)。
get()
返回一个 string,其中包含具有指定名称的所有头部的值,这些值以逗号和空格分隔。
getAll(name)
返回一个 array,其中包含具有指定名称的所有头部的值。
forEach()
Headers 对象中的每个键/值对执行提供的函数一次 (自 0.7.10 版本起)。
has()
返回一个布尔值,指示具有指定名称的头部是否存在。
set()
设置 Headers 对象中现有头部的新值,如果头部不存在则添加该头部 (自 0.7.10 版本起)。

请求

Request()
Request.arrayBuffer()
Request.bodyUsed
Request.cache
Request.credentials
Request.headers
Request.json()
Request.method
Request.mode
Request.text()
Request.url

Fetch APIRequest 接口从 0.7.10 版本起可用。

可以使用 Request() 构造函数创建新的 Request 对象

Request[resource[, options]])
创建一个 Request 对象用于 fetch,该对象稍后可以传递给 ngx.fetch()resource 可以是 URL 或现有的 Request 对象。options 是一个可选参数,应该是一个具有以下键的对象
body
请求体,默认为空。
headers
响应头部对象 — 包含 HTTP 头部用于预填充 Headers 对象的对象,可以是 string、名称-值对 array,或现有的 Headers 对象。
method
HTTP 方法,默认为 GET 方法。

可以使用以下属性和方法创建新的 Request 对象

arrayBuffer()
返回一个解析为 ArrayBufferPromise
bodyUsed
布尔值,如果在请求中使用了 body 则为 true
cache
包含请求的缓存模式。
credentials
包含请求的凭据,默认为 same-origin
headers
Request 相关联的只读 Headers 对象。
json()
返回一个解析为将请求体解析为 JSON 的结果的 Promise
method
包含请求方法。
mode
包含请求的模式。
text()
返回一个解析为请求体的 string 表示的 Promise
url
包含请求的 URL。

响应

Response()
Response.arrayBuffer()
Response.bodyUsed
Response.headers
Response.json()
Response.ok
Response.redirected
Response.status
Response.statusText
Response.text()
Response.type
Response.url

Response 接口从 0.5.1 版本起可用。

可以使用 Response() 构造函数创建新的 Response 对象 (自 0.7.10 版本起)

Response[body[, options]])
创建一个 Response 对象。body 是一个可选参数,可以是 stringbuffer,默认为 nulloptions 是一个可选参数,应该是一个具有以下键的对象
headers
响应头部对象 — 包含 HTTP 头部用于预填充 Headers 对象的对象,可以是 string、名称-值对 array,或现有的 Headers 对象。
status
响应的状态码。
statusText
对应于状态码的状态消息。

可以使用以下属性和方法创建新的 Response() 对象

arrayBuffer()
接收一个 Response 流并完整读取。返回一个解析为 ArrayBufferPromise
bodyUsed
布尔值,如果 body 已被读取则为 true
headers
Response 相关联的只读 Headers 对象。
json()
接收一个 Response 流并完整读取。返回一个解析为将 body 文本解析为 JSON 的结果的 Promise
ok
布尔值,如果响应成功(状态码在 200–299 之间)则为 true
redirected
布尔值,如果响应是重定向的结果则为 true
status
响应的状态码。
statusText
对应于状态码的状态消息。
text()
接收一个 Response 流并完整读取。返回一个解析为 string 的 Promise
type
响应的类型。
url
响应的 URL。

ngx

ngx.build
ngx.conf_file_path
ngx.conf_prefix
ngx.error_log_path
ngx.fetch()
ngx.log()
ngx.prefix
ngx.version
ngx.version_number
ngx.worker_id

ngx 全局对象从 0.5.0 版本起可用。

ngx.build
包含可选 NGINX 构建名称的 string,对应于 configure 脚本的 --build=name 参数,默认为 "" (0.8.0)
ngx.conf_file_path
包含当前 NGINX 配置文件的文件路径的 string (0.8.0)
ngx.conf_prefix
包含 NGINX 配置前缀文件路径的 string — NGINX 当前查找配置文件的目录 (0.7.8)
ngx.error_log_path
包含当前 错误日志文件路径的 string (0.8.0)
ngx.fetch(resource, [options])

发起请求以 fetch resource (0.5.1),resource 可以是 URL 或 Request 对象 (0.7.10)。返回一个解析为 Response 对象的 Promise。从 0.7.0 版本起,支持 https:// scheme,但不处理重定向。

如果 resource 中的 URL 指定为域名,则使用 resolver 进行解析。如果指定了 https:// scheme,则应配置 js_fetch_trusted_certificate 指令以对 resource 的 HTTPS 服务器进行认证。

options 参数应该是一个具有以下键的对象

body
请求体,默认为空
buffer_size
读取响应的缓冲区大小,默认为 4096
headers
请求 头部对象
max_response_body_size
响应体最大大小(字节),默认为 32768
method
HTTP 方法,默认为 GET 方法
verify
启用或禁用 HTTPS 服务器证书验证,默认为 true (0.7.0)

示例

let reply = await ngx.fetch('https://nginxserver.cn/');
let body = await reply.text();

r.return(200, body);

ngx.log(level, message)
以指定的日志级别将 message 写入错误日志。level 参数指定日志级别之一,message 参数可以是 string 或 Buffer。可指定的日志级别如下:ngx.INFOngx.WARNngx.ERR

由于 NGINX 有 硬编码的最大行长度限制,字符串的前 2048 字节才能被记录到日志。

ngx.prefix
包含 NGINX 前缀文件路径的 string — 保存服务器文件的目录 (0.8.0)
ngx.version
包含 NGINX 版本的 string,例如:1.25.0 (0.8.0)
ngx.version_number
包含 NGINX 版本号的 number,例如:1025000 (0.8.0)
ngx.worker_id
对应于 NGINX 内部 worker ID 的 number,该值介于 0worker_processes 指令中指定的值之间 (0.8.0)

ngx.shared

ngx.shared 全局对象从 0.8.0 版本起可用。

SharedDict

ngx.shared.SharedDict.add()
ngx.shared.SharedDict.capacity
ngx.shared.SharedDict.clear()
ngx.shared.SharedDict.delete()
ngx.shared.SharedDict.freeSpace()
ngx.shared.SharedDict.get()
ngx.shared.SharedDict.has()
ngx.shared.SharedDict.incr()
ngx.shared.SharedDict.items()
ngx.shared.SharedDict.keys()
ngx.shared.SharedDict.name
ngx.shared.SharedDict.pop()
ngx.shared.SharedDict.replace()
ngx.shared.SharedDict.set()
ngx.shared.SharedDict.size()
ngx.shared.SharedDict.type

共享字典对象从 0.8.0 版本起可用。共享字典的名称、类型和大小通过 httpstream 中的 js_shared_dict_zone 指令设置。

一个 SharedDict() 对象具有以下属性和方法

ngx.shared.SharedDict.add(key, value [,timeout])
仅当字典中尚不存在指定的 key 时,才为其设置 valuekey 是表示要添加项的键的 string,value 是要添加项的值。

可选的 timeout 参数以毫秒为单位指定,并覆盖 httpstreamjs_shared_dict_zone 指令的 timeout 参数 (自 0.8.5 版本起)。当某些键预期具有独特的超时值时,这非常有用。

如果成功将 value 添加到 SharedDict 字典中,则返回 true;如果字典中已存在该 key,则返回 false。如果 SharedDict 字典中没有足够的可用空间,则抛出 SharedMemoryError。如果 value 的类型与此字典预期的类型不同,则抛出 TypeError

ngx.shared.SharedDict.capacity
返回 SharedDict 字典的容量,对应于 httpstreamjs_shared_dict_zone 指令的 size 参数。
ngx.shared.SharedDict.clear()
SharedDict 字典中移除所有项。
ngx.shared.SharedDict.delete(key)
SharedDict 字典中移除与指定 key 相关联的项,如果字典中存在该项且已被移除则返回 true,否则返回 false
ngx.shared.SharedDict.freeSpace()
返回可用页面大小(字节)。如果大小为零,则如果已占用的页面中有空间,SharedDict 字典仍然会接受新值。
ngx.shared.SharedDict.get(key)
通过其 key 检索项,返回与该 key 相关联的 value,如果没有则返回 undefined
ngx.shared.SharedDict.has(key)
通过其 key 搜索项,如果存在则返回 true,否则返回 false
ngx.shared.SharedDict.incr(key,delta[[,init], timeout]))
将与 key 相关联的整数值按 delta 增量或减量。key 是 string,delta 是要增加或减少值的数字。如果 key 不存在,则该项将初始化为可选的 init 参数,默认为 0

可选的 timeout 参数以毫秒为单位指定,并覆盖 httpstreamjs_shared_dict_zone 指令的 timeout 参数 (自 0.8.5 版本起)。当某些键预期具有独特的超时值时,这非常有用。

返回新值。如果 SharedDict 字典中没有足够的可用空间,则抛出 SharedMemoryError。如果此字典不接受数字,则抛出 TypeError

仅当字典类型在 httpstreamjs_shared_dict_zone 指令中声明了 type=number 参数时,才能使用此方法。

ngx.shared.SharedDict.items([maxCount])
返回 SharedDict 字典的键值项 array (自 0.8.1 版本起)。maxCount 参数设置要检索的最大项数,默认为 1024
ngx.shared.SharedDict.keys([maxCount])
返回 SharedDict 字典的键数组。maxCount 参数设置要检索的最大键数,默认为 1024
ngx.shared.SharedDict.name
返回 SharedDict 字典的名称,对应于 httpstreamjs_shared_dict_zone 指令的 zone= 参数。
ngx.shared.SharedDict.pop(key)
SharedDict 字典中移除与指定 key 关联的项,返回与 key 关联的值,如果不存在则返回 undefined
ngx.shared.SharedDict.replace(key, value)
仅在指定的 key 已存在时替换其对应的 value,如果值成功替换则返回 true,如果 SharedDict 字典中不存在该键则返回 false。如果 SharedDict 字典中没有足够的可用空间,则抛出 SharedMemoryError。如果 value 的类型与此字典期望的类型不同,则抛出 TypeError
ngx.shared.SharedDict.set(key, value [,timeout])
为指定的 key 设置 value,返回此 SharedDict 字典(用于方法链)。

可选的 timeout 参数以毫秒为单位指定,并覆盖 httpstreamjs_shared_dict_zone 指令的 timeout 参数 (自 0.8.5 版本起)。当某些键预期具有独特的超时值时,这非常有用。

ngx.shared.SharedDict.size()
返回 SharedDict 字典中的项数。
ngx.shared.SharedDict.type
返回与 httpstreamjs_shared_dict_zone 指令的 type= 参数设置的 SharedDict 字典类型对应的 stringnumber

内建对象

控制台

console.error()
console.info()
console.log()
console.time()
console.timeEnd()
console.warn()

console 对象自 0.8.2 版本起在 nginx 中可用,自 0.2.6 版本起在 CLI 中可用。

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

сrypto.getRandomValues()
сrypto.subtle.encrypt()
сrypto.subtle.decrypt()
сrypto.subtle.deriveBits()
сrypto.subtle.deriveKey()
сrypto.subtle.digest()
сrypto.subtle.exportKey()
сrypto.subtle.generateKey()
сrypto.subtle.importKey()
сrypto.subtle.sign()
сrypto.subtle.verify()

crypto 对象是一个全局对象,允许使用加密功能(自 0.7.0 版本起)。

сrypto.getRandomValues(typedArray)
获取加密安全的随机值。返回作为 typedArray 传入的同一个数组,但其内容已被新生成的随机数替换。可能的值
typedArray
可以是 Int8Array, Int16Array, Uint16Array, Int32ArrayUint32Array
сrypto.subtle.encrypt(algorithm, key, data)
使用提供的 algorithmkey 加密 data。返回一个以包含密文的 ArrayBuffer 兑现的 Promise。可能的值
algorithm
一个对象,指定要使用的算法以及任何所需的额外参数
  • 对于 RSA-OAEP,传入包含以下键的对象
    • name 是一个字符串,应设置为 RSA-OAEP

      crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
      

  • 对于 AES-CTR,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-CTR
    • counter 是一个 ArrayBuffer, TypedArrayDataView — 计数器块的初始值,必须为 16 字节长(AES 块大小)。此块最右边的 length 位用于计数器,其余用于 nonce。例如,如果 length 设置为 64,则 counter 的前半部分是 nonce,后半部分用作计数器
    • length 是计数器块中用于实际计数器的位数。计数器必须足够大,以免溢出。
  • 对于 AES-CBC,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-CBC
    • iv 或初始化向量,是一个 ArrayBuffer, TypedArrayDataView,必须为 16 字节,不可预测,最好是加密安全的随机值。但是,它不必保密,例如,它可以与密文一起未经加密传输。
  • 对于 AES-GCM,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-GCM
    • iv 或初始化向量,是一个 ArrayBuffer, TypedArrayDataView,必须为 16 字节,且对于使用给定密钥进行的每一次加密操作都必须是唯一的
    • additionalData(可选)是一个 ArrayBuffer, TypedArrayDataView,包含不会被加密但会与加密数据一起进行身份验证的附加数据。如果指定了 additionalData,则在相应的 decrypt() 调用中必须指定相同的数据:如果提供给 decrypt() 调用的数据与原始数据不匹配,则解密将抛出异常。additionalData 的位长度必须小于 2^64 - 1
    • tagLength(可选,默认值为 128)- 一个 number,确定加密操作中生成的身份验证标签的位大小,并用于相应的解密身份验证。可能的值有:32, 64, 96, 104, 112, 120128。AES-GCM 规范建议应为 96, 104, 112, 120128,尽管在某些应用中 3264 位也是可接受的。
key
一个 CryptoKey 对象,包含用于加密的密钥
data
一个 ArrayBuffer, TypedArrayDataView,包含要加密的数据(也称为明文)
сrypto.subtle.decrypt(algorithm, key, data)
解密加密数据。返回一个包含解密数据的 Promise。可能的值
algorithm
一个对象,指定要使用的算法以及任何所需的额外参数。额外参数的值必须与传入相应 encrypt() 调用的值匹配。
  • 对于 RSA-OAEP,传入包含以下键的对象
    • name 是一个字符串,应设置为 RSA-OAEP

      crypto.subtle.encrypt({name: "RSA-OAEP"}, key, data)
      

  • 对于 AES-CTR,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-CTR
    • counter 是一个 ArrayBuffer, TypedArrayDataView — 计数器块的初始值,必须为 16 字节长(AES 块大小)。此块最右边的 length 位用于计数器,其余用于 nonce。例如,如果 length 设置为 64,则 counter 的前半部分是 nonce,后半部分用作计数器。
    • length 是计数器块中用于实际计数器的位数。计数器必须足够大,以免溢出。
  • 对于 AES-CBC,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-CBC
    • iv 或初始化向量,是一个 ArrayBuffer, TypedArrayDataView,必须为 16 字节,不可预测,最好是加密安全的随机值。但是,它不必保密(例如,它可以与密文一起未经加密传输)。
  • 对于 AES-GCM,传入包含以下键的对象
    • name 是一个字符串,应设置为 AES-GCM
    • iv 或初始化向量,是一个 ArrayBuffer, TypedArrayDataView,必须为 16 字节,且对于使用给定密钥进行的每一次加密操作都必须是唯一的
    • additionalData(可选)是一个 ArrayBuffer, TypedArrayDataView,包含不会被加密但会与加密数据一起进行身份验证的附加数据。如果指定了 additionalData,则在相应的 decrypt() 调用中必须指定相同的数据:如果提供给 decrypt() 调用的数据与原始数据不匹配,则解密将抛出异常。additionalData 的位长度必须小于 2^64 - 1
    • tagLength(可选,默认值为 128)- 一个 number,确定加密操作中生成的身份验证标签的位大小,并用于相应的解密身份验证。可能的值有:32, 64, 96, 104, 112, 120128。AES-GCM 规范建议应为 96, 104, 112, 120128,尽管在某些应用中 3264 位也是可接受的。
key
一个 CryptoKey 对象,包含用于解密的密钥。如果使用 RSA-OAEP,这是 CryptoKeyPair 对象的 privateKey 属性。
data
一个 ArrayBuffer, TypedArrayDataView,包含要解密的数据(也称为密文)
сrypto.subtle.deriveBits(algorithm, baseKey, length)
从基础密钥派生位数组。返回一个 Promise,该 Promise 将以包含派生位的 ArrayBuffer 兑现。可能的值
algorithm
一个对象,定义要使用的派生算法
  • 对于 HKDF,传入包含以下键的对象
    • name 是一个字符串,应设置为 HKDF
    • hash 是一个字符串,包含要使用的摘要算法:SHA-1, SHA-256, SHA-384SHA-512
    • salt 是一个 ArrayBuffer, TypedArrayDataView,表示随机或伪随机值,其长度与 digest 函数的输出长度相同。与传入 deriveKey() 的输入密钥材料不同,salt 不需要保密。
    • info 是一个 ArrayBuffer, TypedArrayDataView,表示特定于应用的上下文信息,用于将派生密钥绑定到应用或上下文,并允许在使用相同输入密钥材料的情况下为不同上下文派生不同的密钥。此属性是必需的,但可以是空缓冲区。
  • 对于 PBKDF2,传入包含以下键的对象
    • name 是一个字符串,应设置为 PBKDF2
    • hash 是一个字符串,包含要使用的摘要算法:SHA-1, SHA-256, SHA-384SHA-512
    • salt 是一个 ArrayBuffer, TypedArrayDataView,表示至少 16 字节的随机或伪随机值。与传入 deriveKey() 的输入密钥材料不同,salt 不需要保密。
    • iterations 是一个 number,表示在 deriveKey() 中执行哈希函数的次数
baseKey
是一个 CryptoKey 对象,表示派生算法的输入 - 派生函数的初始密钥材料:例如,对于 PBKDF2,它可能是一个密码,使用 сrypto.subtle.importKey() 导入为 CryptoKey
length
是一个表示要派生位数的数字。为了兼容浏览器,该数字应为 8 的倍数
сrypto.subtle.deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages)
从主密钥派生秘密密钥。可能的值
algorithm
一个对象,定义要使用的派生算法
  • 对于 HKDF,传入包含以下键的对象
    • name 是一个字符串,应设置为 HKDF
    • hash 是一个字符串,包含要使用的摘要算法:SHA-1, SHA-256, SHA-384SHA-512
    • salt 是一个 ArrayBuffer, TypedArrayDataView,表示随机或伪随机值,其长度与 digest 函数的输出长度相同。与传入 deriveKey() 的输入密钥材料不同,salt 不需要保密。
    • info 是一个 ArrayBuffer, TypedArrayDataView,表示特定于应用的上下文信息,用于将派生密钥绑定到应用或上下文,并允许在使用相同输入密钥材料的情况下为不同上下文派生不同的密钥。此属性是必需的,但可以是空缓冲区。
  • 对于 PBKDF2,传入包含以下键的对象
    • name 是一个字符串,应设置为 PBKDF2
    • hash 是一个字符串,包含要使用的摘要算法:SHA-1, SHA-256, SHA-384SHA-512
    • salt 是一个 ArrayBuffer, TypedArrayDataView,表示至少 16 字节的随机或伪随机值。与传入 deriveKey() 的输入密钥材料不同,salt 不需要保密。
    • iterations 是一个 number,表示在 deriveKey() 中执行哈希函数的次数
baseKey
是一个 CryptoKey 对象,表示派生算法的输入 - 派生函数的初始密钥材料:例如,对于 PBKDF2,它可能是一个密码,使用 сrypto.subtle.importKey() 导入为 CryptoKey
derivedKeyAlgorithm
是一个对象,定义派生密钥将用于的算法
  • 对于 HMAC,传入包含以下键的对象
    • name 是一个字符串,应设置为 HMAC
    • hash 是一个字符串,包含要使用的摘要函数的名称:SHA-1, SHA-256, SHA-384SHA-512
    • length(可选)是一个 number,表示密钥的位长度。如果未指定,密钥的长度等于所选哈希函数的块大小
  • 对于 AES-CTR, AES-CBCAES-GCM,传入包含以下键的对象
    • name 是一个字符串,应根据使用的算法设置为 AES-CTR, AES-CBCAES-GCM
    • length 是一个 number,表示要生成密钥的位长度:128, 192256
extractable
一个布尔值,指示是否可以导出密钥
keyUsages
是一个 Array,指示可以使用派生密钥执行的操作。密钥用法必须由 derivedKeyAlgorithm 中设置的算法允许。可能的值
encrypt
用于加密消息的密钥
decrypt
用于解密消息的密钥
sign
用于签名消息的密钥
verify
用于验证签名的密钥
deriveKey
用于派生新密钥的密钥
deriveBits
用于派生位的密钥
wrapKey
用于包装密钥的密钥
unwrapKey
用于解包密钥的密钥
сrypto.subtle.digest(algorithm, data)
生成给定数据的摘要。接受要使用的摘要算法标识符和要摘要的数据作为参数。返回一个将以摘要兑现的 Promise。可能的值
algorithm
是一个字符串,定义要使用的哈希函数:SHA-1(不适用于加密应用), SHA-256, SHA-384SHA-512
data
是一个 ArrayBuffer, TypedArrayDataView,包含要摘要的数据
сrypto.subtle.exportKey(format, key)
导出密钥:将密钥作为 CryptoKey 对象传入,并以外部可移植格式返回密钥(自 0.7.10 版本起)。如果 formatjwk,则 Promise 会以包含密钥的 JSON 对象兑现。否则,Promise 会以包含密钥的 ArrayBuffer 兑现。可能的值
format
一个字符串,描述密钥应导出的数据格式,可以是以下之一
raw
原始数据格式
pkcs8
PKCS #8 格式
spki
SubjectPublicKeyInfo 格式
jwk
JSON Web Key (JWK) 格式(自 0.7.10 版本起)
key
包含要导出密钥的 CryptoKey 对象
сrypto.subtle.generateKey(algorithm, extractable, usage)
为对称算法生成新密钥或为公钥算法生成密钥对(自 0.7.10 版本起)。返回一个 Promise,该 Promise 会以生成的密钥作为 CryptoKeyCryptoKeyPair 对象兑现。可能的值
algorithm
一个字典对象,定义要生成密钥的类型并提供额外的算法特定参数
  • 对于 RSASSA-PKCS1-v1_5, RSA-PSSRSA-OAEP,传入包含以下键的对象
    • name 是一个字符串,应根据使用的算法设置为 RSASSA-PKCS1-v1_5, RSA-PSSRSA-OAEP
    • hash 是一个字符串,表示要使用的 digest 函数的名称,可以是 SHA-256, SHA-384SHA-512
  • 对于 ECDSA,传入包含以下键的对象
    • name 是一个字符串,应设置为 ECDSA
    • namedCurve 是一个字符串,表示要使用的椭圆曲线的名称,可以是 P-256, P-384P-521
  • 对于 HMAC,传入包含以下键的对象
    • name 是一个字符串,应设置为 HMAC
    • hash 是一个字符串,表示要使用的 digest 函数的名称,可以是 SHA-256, SHA-384SHA-512
    • length(可选)是一个数字,表示密钥的位长度。如果省略,密钥的长度等于所选摘要函数生成的摘要长度。
  • 对于 AES-CTR, AES-CBCAES-GCM,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象,其中 ALGORITHM 是算法的名称
extractable
布尔值,指示是否可以导出密钥
usage
一个 array,指示可以使用密钥执行的可能操作
encrypt
用于加密消息的密钥
decrypt
用于解密消息的密钥
sign
用于签名消息的密钥
verify
用于验证签名的密钥
deriveKey
用于派生新密钥的密钥
deriveBits
用于派生位的密钥
wrapKey
用于包装密钥的密钥
unwrapKey
用于解包密钥的密钥
сrypto.subtle.importKey(format, keyData, algorithm, extractable, keyUsages)
导入密钥:将外部可移植格式的密钥作为输入,并生成一个 CryptoKey 对象。返回一个 Promise,该 Promise 会以导入的密钥作为 CryptoKey 对象兑现。可能的值
format
一个字符串,描述要导入密钥的数据格式,可以是以下之一
raw
原始数据格式
pkcs8
PKCS #8 格式
spki
SubjectPublicKeyInfo 格式
jwk
JSON Web Key (JWK) 格式(自 0.7.10 版本起)
keyData
一个 ArrayBuffer, TypedArrayDataView 对象,包含给定格式的密钥
algorithm
一个字典对象,定义要导入密钥的类型并提供额外的算法特定参数
  • 对于 RSASSA-PKCS1-v1_5, RSA-PSSRSA-OAEP,传入包含以下键的对象
    • name 是一个字符串,应根据使用的算法设置为 RSASSA-PKCS1-v1_5, RSA-PSSRSA-OAEP
    • hash 是一个字符串,表示要使用的 digest 函数的名称,可以是 SHA-1, SHA-256, SHA-384SHA-512
  • 对于 ECDSA,传入包含以下键的对象
    • name 是一个字符串,应设置为 ECDSA
    • namedCurve 是一个字符串,表示要使用的椭圆曲线的名称,可以是 P-256, P-384P-521
  • 对于 HMAC,传入包含以下键的对象
    • name 是一个字符串,应设置为 HMAC
    • hash 是一个字符串,表示要使用的 digest 函数的名称,可以是 SHA-256, SHA-384SHA-512
    • length(可选)是一个数字,表示密钥的位长度。如果省略,密钥的长度等于所选摘要函数生成的摘要长度。
  • 对于 AES-CTR, AES-CBCAES-GCM,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象,其中 ALGORITHM 是算法的名称
  • 对于 PBKDF2,传入字符串 PBKDF2
  • 对于 HKDF,传入字符串 HKDF
extractable
布尔值,指示是否可以导出密钥
keyUsages
一个 array,指示可以使用密钥执行的可能操作
encrypt
用于加密消息的密钥
decrypt
用于解密消息的密钥
sign
用于签名消息的密钥
verify
用于验证签名的密钥
deriveKey
用于派生新密钥的密钥
deriveBits
用于派生位的密钥
wrapKey
用于包装密钥的密钥
unwrapKey
用于解包密钥的密钥
сrypto.subtle.sign(algorithm, key, data)
返回 signature 作为 Promise,该 Promise 以包含签名的 ArrayBuffer 兑现。可能的值
algorithm
是一个字符串或对象,指定要使用的签名算法及其参数
  • 对于 RSASSA-PKCS1-v1_5,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象
  • 对于 RSA-PSS,传入包含以下键的对象
    • name 是一个字符串,应设置为 RSA-PSS
    • saltLength 是一个长 integer,表示要使用的随机 salt 的长度,以字节为单位
  • 对于 ECDSA,传入包含以下键的对象
    • name 是一个字符串,应设置为 ECDSA
    • hash 是要使用的摘要算法的标识符,可以是 SHA-256, SHA-384SHA-512
  • 对于 HMAC,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象
key
是一个 CryptoKey 对象,表示用于签名的密钥。如果算法标识公钥密码系统,则这是私钥。
data
是一个 ArrayBuffer, TypedArrayDataView 对象,包含要签名的数据
сrypto.subtle.verify(algorithm, key, signature, data)
验证数字签名,返回一个以布尔值兑现的 Promise:如果签名有效则为 true,否则为 false。可能的值
algorithm
是一个字符串或对象,指定要使用的算法及其参数
  • 对于 RSASSA-PKCS1-v1_5,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象
  • 对于 RSA-PSS,传入包含以下键的对象
    • name 是一个字符串,应设置为 RSA-PSS
    • saltLength 是一个长 integer,表示要使用的随机 salt 的长度,以字节为单位
  • 对于 ECDSA,传入包含以下键的对象
    • name 是一个字符串,应设置为 ECDSA
    • hash 是要使用的摘要算法的标识符,可以是 SHA-256, SHA-384SHA-512
  • 对于 HMAC,传入标识算法的字符串或形式为 { "name": "ALGORITHM" } 的对象
key
是一个 CryptoKey 对象,表示用于验证的密钥。对于对称算法是秘密密钥,对于公钥系统是公钥。
signature
是一个 ArrayBuffer, TypedArrayDataView,包含要验证的签名
data
是一个 ArrayBuffer, TypedArrayDataView 对象,包含其签名要验证的数据

CryptoKey

CryptoKey.algorithm
CryptoKey.extractable
CryptoKey.type
CryptoKey.usages

CryptoKey 对象表示通过 SubtleCrypto 方法之一(сrypto.subtle.generateKey(), сrypto.subtle.deriveKey(), сrypto.subtle.importKey())获取的加密 key

CryptoKey.algorithm
返回一个对象,描述此密钥可用于的算法以及任何相关的额外参数(自 0.8.0 版本起),只读
CryptoKey.extractable
一个布尔值,如果密钥可以导出则为 true(自 0.8.0 版本起),只读
CryptoKey.type
一个字符串值,指示对象表示的密钥类型,只读。可能的值
secret
此密钥是用于对称算法的秘密密钥。
private
此密钥是非对称算法的 CryptoKeyPair 的私钥部分。
public
此密钥是非对称算法的 CryptoKeyPair 的公钥部分。
CryptoKey.usages
一个字符串数组,指示此密钥可用于的操作(自 0.8.0 版本起),只读。可能的数组值
encrypt
用于加密消息的密钥
decrypt
用于解密消息的密钥
sign
用于签名消息的密钥
verify
用于验证签名的密钥
deriveKey
用于派生新密钥的密钥
deriveBits
用于派生位的密钥

CryptoKeyPair

CryptoKeyPair.privateKey
CryptoKeyPair.publicKey

CryptoKeyPairWebCrypto API 的一个字典对象,表示非对称密钥对。

CryptoKeyPair.privateKey
一个表示私钥的 CryptoKey 对象。
CryptoKeyPair.publicKey
一个表示公钥的 CryptoKey 对象。

njs

njs.version
njs.version_number
njs.dump()
njs.memoryStats
njs.on()

njs 对象是一个全局对象,表示当前的 VM 实例(自 0.2.0 版本起)。

njs.version
返回一个字符串,包含 njs 的当前版本(例如,“0.7.4”)。
njs.version_number
返回一个数字,包含 njs 的当前版本。例如,“0.7.4” 返回为 0x000704(自 0.7.4 版本起)。
njs.dump(value)
返回值的漂亮打印字符串表示。
njs.memoryStats
包含当前 VM 实例内存统计信息的对象(自 0.7.8 版本起)。
size
njs 内存池从操作系统申请的内存量,以字节为单位。
njs.on(event, callback)
为指定的 VM 事件注册回调(自 0.5.2 版本起)。事件可以是以下字符串之一
exit
在 VM 销毁之前调用。回调在没有参数的情况下调用。

process

process.argv
process.env
process.kill()
process.pid
process.ppid

process 对象是一个全局对象,提供关于当前进程的信息(自 0.3.3 版本起)。

process.argv
返回一个数组,包含当前进程启动时传递的命令行参数。
process.env
返回一个包含用户环境的对象。
默认情况下,nginx 会移除除 TZ 变量外所有继承自其父进程的环境变量。使用 env 指令可以保留一些继承的变量。
process.kill(pid, number | string)
向由 pid 标识的进程发送信号。信号名称可以是数字或字符串,例如 'SIGINT' 或 'SIGHUP'。有关详细信息,请参阅 kill(2)
process.pid
返回当前进程的 PID。
process.ppid
返回当前父进程的 PID。

String

默认情况下,njs 中的所有字符串都是 Unicode 字符串。它们对应于包含 Unicode 字符的 ECMAScript 字符串。在 0.8.0 版本之前,还支持字节字符串。

字节字符串

0.8.0 版本起,移除了对字节字符串和字节字符串方法的支持。处理字节序列时,应使用 Buffer 对象和 Buffer 属性,例如 r.requestBuffer, r.rawVariables

字节字符串包含一个字节序列,用于将 Unicode 字符串序列化到外部数据并从外部源反序列化。例如,toUTF8() 方法使用 UTF-8 编码将 Unicode 字符串序列化为字节字符串

>> '£'.toUTF8().toString('hex')
'c2a3'  /* C2 A3 is the UTF-8 representation of 00A3 ('£') code point */

当码点小于等于 255 时,toBytes() 方法将 Unicode 字符串序列化为字节字符串,否则返回 null

>> '£'.toBytes().toString('hex')
'a3'  /* a3 is a byte equal to 00A3 ('£') code point  */

String.bytesFrom(array | string, encoding)
该方法在 0.4.4 版本中被废弃,并在 0.8.0 版本中移除。应改用 Buffer.from 方法
>> Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]).toString()
'buffer'

>> Buffer.from('YnVmZmVy', 'base64').toString()
'buffer'
0.4.4 版本之前,可以从包含八位字节的数组或编码字符串(0.2.3)创建字节字符串,编码可以是 hex, base64base64url
String.prototype.fromBytes(start[, end])
该属性在 0.7.7 版本中被废弃,并在 0.8.0 版本中移除。在 0.7.7 版本之前,从字节字符串返回一个新的 Unicode 字符串,其中每个字节被替换为相应的 Unicode 码点。
String.prototype.fromUTF8(start[, end])
该属性在 0.7.7 版本中被废弃,并在 0.8.0 版本中移除。应改用 TextDecoder 方法。在 0.7.7 版本之前,将包含有效 UTF-8 字符串的字节字符串转换为 Unicode 字符串,否则返回 null
String.prototype.toBytes(start[, end])
该属性在 0.7.7 版本中被废弃,并在 0.8.0 版本中移除。在 0.7.7 版本之前,将 Unicode 字符串序列化为字节字符串,如果在字符串中找到大于 255 的字符则返回 null
String.prototype.toString(encoding)

该属性在 0.7.7 版本中被废弃,并在 0.8.0 版本中移除。在 0.7.7 版本之前,可以将字符串编码为 hex, base64base64url

>>  'αβγδ'.toString('base64url')
'zrHOss6zzrQ'

0.4.3 版本之前,只能编码 字节字符串

>>  'αβγδ'.toUTF8().toString('base64url')
'zrHOss6zzrQ'

String.prototype.toUTF8(start[, end])
该属性在 0.7.7 版本中被废弃,并在 0.8.0 版本中移除。应改用 TextEncoder 方法。在 0.7.7 版本之前,使用 UTF-8 编码将 Unicode 字符串序列化为字节字符串
>> 'αβγδ'.toUTF8().length
8
>> 'αβγδ'.length
4

Web API

Text Decoder

TextDecoder()
TextDecoder.prototype.encoding
TextDecoder.prototype.fatal
TextDecoder.prototype.ignoreBOM
TextDecoder.prototype.decode()

TextDecoder 从字节流生成码点流(自 0.4.3 版本起)。

TextDecoder([[encoding], options]])
为指定的 encoding 创建一个新的 TextDecoder 对象,目前仅支持 UTF-8。options 是一个 TextDecoderOptions 字典,包含属性
fatal
布尔标志,指示当发现编码错误时,TextDecoder.decode() 是否必须抛出 TypeError 异常,默认为 false
TextDecoder.prototype.encoding
返回一个字符串,包含 TextDecoder() 使用的编码名称,只读。
TextDecoder.prototype.fatal
布尔标志,如果错误模式是致命的则为 true,只读。
TextDecoder.prototype.ignoreBOM
布尔标志,如果忽略字节顺序标记则为 true,只读。
TextDecoder.prototype.decode(buffer, [options])
返回一个字符串,其中包含由 TextDecoder()buffer 解码的文本。buffer 可以是 ArrayBufferoptions 是一个 TextDecodeOptions 字典,包含属性
stream
布尔标志,指示后续对 decode() 的调用是否会跟进附加数据:如果是分块处理数据,则为 true;如果是最终块或数据未分块,则为 false。默认为 false
>> (new TextDecoder()).decode(new Uint8Array([206,177,206,178]))
αβ

Text Encoder

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,并返回一个显示编码进度的字典对象。该字典对象包含两个成员
read
从源 string 转换为 UTF-8 的 UTF-16 代码单元数
written
目标 Uint8Array 中修改的字节数

timers

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 值 031

const encodedData = btoa("text to encode"); // encode a string
const decodedData = atob(encodedData); // decode the string

btoa(stringToEncode)
从二进制字符串创建一个 Base64 编码的 ASCII 字符串。stringToEncode 参数是要编码的二进制字符串。返回一个包含 stringToEncode 的 Base64 表示的 ASCII 字符串。

该方法可用于编码可能导致通信问题的数据,然后进行传输,并使用 atob() 方法再次解码数据。例如,您可以编码控制字符,例如 ASCII 值 031

const encodedData = btoa("text to encode"); // encode a string
const decodedData = atob(encodedData); // decode the string

内建模块

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.buffer
buf.byteOffset
buf.compare()
buf.copy()
buf.equals()
buf.fill()
buf.includes()
buf.indexOf()
buf.lastIndexOf()
buf.length
buf.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()

Buffer.alloc(size[, fill[, encoding]]))

分配一个指定 size 的新 Buffer。如果没有指定 fill,Buffer 将会被零填充。如果指定了 fill,分配的 Buffer 将通过调用 buf.fill(fill) 进行初始化。如果指定了 fillencoding,分配的 Buffer 将通过调用 buf.fill(fill, encoding) 进行初始化。

fill 参数可以是 stringBufferUint8Arrayinteger

Buffer.allocUnsafe(size)

Buffer.alloc() 相同,区别在于为 Buffer 分配的内存没有被初始化,新 Buffer 的内容是未知的,可能包含敏感数据。

Buffer.byteLength(value[, encoding])
返回一个指定值的字节长度,使用 encoding 进行编码时。该值可以是 stringBufferTypedArrayDataViewArrayBuffer。如果该值是 string,则 encoding 参数为其编码,可以是 utf8hexbase64base64url;默认为 utf8
Buffer.compare(buffer1, buffer2)
在对 Buffer 实例数组进行排序时,比较 buffer1buffer2。如果 buffer1buffer2 相同,则返回 0;如果排序时 buffer2 应该在 buffer1 之前,则返回 1;如果排序时 buffer2 应该在 buffer1 之后,则返回 -1
Buffer.concat(list[, totalLength])
返回一个新 Buffer,它是列表中所有 Buffer 实例连接的结果。如果列表中没有项或总长度为 0,则返回一个新的零长度 Buffer。如果没有指定 totalLength,则通过将列表中 Buffer 实例的长度相加来计算。如果指定了 totalLength,则将其强制转换为无符号整数。如果列表中 Buffers 的总长度超过 totalLength,则结果将被截断为 totalLength
Buffer.from(array)
使用一个字节范围在 0255 之间的数组来分配一个新的 Buffer。超出该范围的数组条目将被截断。
Buffer.from(arrayBuffer, byteOffset[, length]])
创建 ArrayBuffer 的视图,而不复制底层内存。可选的 byteOffsetlength 参数指定 arrayBuffer 中将由 Buffer 共享的内存范围。
Buffer.from(buffer)
将传入的 Buffer 数据复制到新的 Buffer 实例中。
Buffer.from(object[, offsetOrEncoding[, length]])
对于其 valueOf() 函数返回的值与对象不严格相等(!==)的对象,返回 Buffer.from(object.valueOf(), offsetOrEncoding, length)。
Buffer.from(string[, encoding])
使用 string 创建一个新的 Buffer。encoding 参数指定将字符串转换为字节时使用的字符编码。编码可以是 utf8hexbase64base64url;默认为 utf8
Buffer.isBuffer(object)
一个布尔值,如果 object 是 Buffer,则返回 true
Buffer.isEncoding(encoding)
一个布尔值,如果 encoding 是支持的字符编码的名称,则返回 true
buffer[index]
索引操作符,可用于获取和设置 buffer 中位置 index 的八位字节。这些值表示单个字节,因此合法的值范围是 0 到 255(十进制)。
buf.buffer
此 Buffer 对象基于其创建的底层 ArrayBuffer 对象。
buf.byteOffset
一个整数,指定 Buffer 的底层 ArrayBuffer 对象的 byteOffset
buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])
将 Buffer 与 target 进行比较,并返回一个数字,指示 Buffer 在排序顺序上是位于 target 之前、之后还是与 target 相同。比较基于每个 Buffer 中实际的字节序列。targetStart 是一个整数,指定在 target 内开始比较的偏移量,默认为 0。targetEnd 是一个整数,指定在 target 内结束比较的偏移量(不包含),默认为 target.lengthsourceStart 是一个整数,指定在 Buffer 内开始比较的偏移量,默认为 0。sourceEnd 是一个整数,指定在 Buffer 内结束比较的偏移量(不包含),默认为 buf.length
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
将数据从 Buffer 的某个区域复制到 target 的某个区域,即使目标内存区域与 Buffer 重叠。target 参数是要复制到的 BufferUint8Array

targetStart 是一个整数,指定在 target 内开始写入的偏移量,默认为 0。sourceStart 是一个整数,指定从 Buffer 内开始复制的偏移量,默认为 0。sourceEnd 是一个整数,指定在 Buffer 内停止复制(不包含)的偏移量,默认为 buf.length

buf.equals(otherBuffer)
一个布尔值,如果 Buffer 和 otherBuffer 的字节完全相同,则返回 true
buf.fill(value[, offset[, end]][, encoding])
用指定的 value 填充 Buffer。如果未指定 offsetend,则填充整个 Buffer。如果 value 不是 stringBufferinteger,则会被强制转换为 uint32。如果生成的整数大于 255,Buffer 将填充 value 与 255 相与的结果(即截断为单字节)。
buf.includes(value[, byteOffset][, encoding])
等同于 buf.indexOf() !== -1,如果 Buffer 中找到了 value,则返回 true
buf.indexOf(value[, byteOffset][, encoding])
返回一个整数,它是 value 在 Buffer 中第一次出现的索引,如果 Buffer 不包含 value,则返回 -1value 可以是带有指定 encoding(默认为 utf8)的 stringBufferUnit8Array,或者是 0 到 255 之间的数字。
buf.lastIndexOf(value[, byteOffset][, encoding])
buf.indexOf() 相同,但找到的是 value 最后一次出现的位置而不是第一次。value 可以是字符串、Buffer 或 1 到 255 之间的整数。如果 value 是空字符串或空 Buffer,则返回 byteOffset
buf.length
返回 Buffer 中的字节数。
buf.readIntBE(offset, byteLength)
buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为大端序(big-endian)、使用二进制补码的有符号值,支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要读取的字节数。

还支持类似的方法:buf.readInt8([offset])buf.readInt16BE([offset])buf.readInt32BE([offset])

buf.readIntLE(offset, byteLength)
buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为小端序(little-endian)、使用二进制补码的有符号值,支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要读取的字节数。

还支持类似的方法:buf.readInt8([offset])buf.readInt16LE([offset])buf.readInt32LE([offset])

buf.readUIntBE(offset, byteLength)
buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为大端序(big-endian)的无符号整数,支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要读取的字节数。

还支持类似的方法:buf.readUInt8([offset])buf.readUInt16BE([offset])buf.readUInt32BE([offset])

buf.readUIntLE(offset, byteLength)
buf 中指定 offset 位置读取 byteLength 个字节,并将结果解释为小端序(little-endian)的无符号整数,支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要读取的字节数。

还支持类似的方法:buf.readUInt8([offset])buf.readUInt16LE([offset])buf.readUInt32LE([offset])

buf.readDoubleBE([offset])
buf 中指定 offset 位置读取一个 64 位大端序双精度浮点数。
buf.readDoubleLE([offset])
buf 中指定 offset 位置读取一个 64 位小端序双精度浮点数。
buf.readFloatBE([offset])
buf 中指定 offset 位置读取一个 32 位大端序单精度浮点数。
buf.readFloatLE([offset])
buf 中指定 offset 位置读取一个 32 位小端序单精度浮点数。
buf.subarray([start[, end]])
返回一个新的 buf,它引用与原始 Buffer 相同的内存,但通过 startend 进行了偏移和裁剪。如果 end 大于 buf.length,则返回与 end 等于 buf.length 时相同的结果。
buf.slice([start[, end]])
返回一个新的 buf,它引用与原始 Buffer 相同的内存,但通过 startend 值进行了偏移和裁剪。该方法与 Uint8Array.prototype.slice() 不兼容,后者是 Buffer 的超类。要复制切片,请使用 Uint8Array.prototype.slice()
buf.swap16()
buf 解释为一个无符号 16 位数字的数组,并就地(in-place)交换字节顺序。如果 buf.length 不是 2 的倍数,则抛出错误。
buf.swap32()
buf 解释为一个无符号 32 位数字的数组,并就地交换字节顺序。如果 buf.length 不是 4 的倍数,则抛出错误。
buf.swap64()
buf 解释为一个 64 位数字的数组,并就地交换字节顺序。如果 buf.length 不是 8 的倍数,则抛出错误。
buf.toJSON()
返回 buf 的 JSON 表示。JSON.stringify() 在字符串化 Buffer 实例时会隐式调用此函数。
buf.toString([encoding[, start[, end]]])
根据指定的字符 encodingbuf 解码为字符串,编码可以是 utf8hexbase64base64url。可以传入 startend 参数以仅解码 Buffer 的子集。
buf.write(string[, offset[, length]][, encoding])
根据字符 encodingstring 写入 bufoffset 位置。length 参数是要写入的字节数。如果 Buffer 没有足够的空间容纳整个字符串,则只会写入字符串的一部分,但是,不会写入部分编码的字符。encoding 可以是 utf8hexbase64base64url
buf.writeIntBE(value, offset, byteLength)
valuebyteLength 个字节作为大端序写入 buf 的指定 offset 位置。支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要写入的字节数。

还支持以下类似方法:buf.writeInt8buf.writeInt16BEbuf.writeInt32BE

buf.writeIntLE(value, offset, byteLength)
valuebyteLength 个字节作为小端序写入 buf 的指定 offset 位置。支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要写入的字节数。

还支持以下类似方法:buf.writeInt8buf.writeInt16LEbuf.writeInt32LE

buf.writeUIntBE(value, offset, byteLength)
valuebyteLength 个字节作为大端序写入 buf 的指定 offset 位置。支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要写入的字节数。

还支持以下类似方法:buf.writeUInt8buf.writeUInt16BEbuf.writeUInt32BE

buf.writeUIntLE(value, offset, byteLength)
valuebyteLength 个字节作为小端序写入 buf 的指定 offset 位置。支持高达 48 位的精度。byteLength 参数是一个介于 1 和 6 之间的整数,指定要写入的字节数。

还支持以下类似方法:buf.writeUInt8buf.writeUInt16LEbuf.writeUInt32LE

buf.writeDoubleBE(value, [offset])
value 作为大端序写入 buf 的指定 offset 位置。
buf.writeDoubleLE(value, [offset])
value 作为小端序写入 buf 的指定 offset 位置。
buf.writeFloatBE(value, [offset])
value 作为大端序写入 buf 的指定 offset 位置。
buf.writeFloatLE(value, [offset])
value 作为小端序写入 buf 的指定 offset 位置。

Crypto

crypto.createHash()
crypto.createHmac()

0.7.0 起,扩展的 crypto API 可作为全局 crypto 对象使用。

Crypto 模块提供加密功能支持。Crypto 模块对象通过 import crypto from 'crypto' 导入。

crypto.createHash(algorithm)
创建并返回一个 Hash 对象,该对象可用于使用给定的 algorithm 生成哈希摘要。算法可以是 md5sha1sha256
crypto.createHmac(algorithm, secret key)
创建并返回一个 HMAC 对象,该对象使用给定的 algorithmsecret key。算法可以是 md5sha1sha256

Hash

hash.update()
hash.digest()

hash.update(data)
使用给定的 data 更新哈希内容。
hash.digest([encoding])
计算通过 hash.update() 传入的所有数据的摘要。编码可以是 hexbase64base64url。如果未提供编码,则返回 Buffer 对象(0.4.4)。
0.4.4 版本之前,返回的是字节字符串而不是 Buffer 对象。
hash.copy()
复制哈希的当前状态(自 0.7.12 起)。

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 摘要。编码可以是 hexbase64base64url。如果未提供编码,则返回 Buffer 对象(0.4.4)。
0.4.4 版本之前,返回的是字节字符串而不是 Buffer 对象。

import crypto from 'crypto';

crypto.createHmac('sha1', 'secret.key').update('AB').digest('base64url');
/* Oglm93xn23_MkiaEq_e9u8zk374 */

File System

fs.accessSync()
fs.appendFileSync()
fs.closeSync()
fs.existsSync()
fs.fstatSync()
fs.lstatSync()
fs.mkdirSync()
fs.openSync()
fs.promises.open()
fs.readdirSync()
fs.readFileSync()
fs.readlinkSync()
fs.readSync()
fs.realpathSync()
fs.renameSync()
fs.rmdirSync()
fs.statSync()
fs.symlinkSync()
fs.unlinkSync()
fs.writeFileSync()
fs.writeSync()
fs.writeSync()

fs.Dirent
fs.FileHandle
fs.Stats
File Access Constants
File System Flags

文件系统模块提供了文件操作功能。

模块对象通过 import fs from 'fs' 导入。自 0.3.9 起,通过 import fs from 'fs' 导入后,可以通过 fs.promises 对象获取文件系统方法的 Promise 版本。

import fs from 'fs';

fs.promises.readFile("/file/path").then((data) => {
    /* <file data> */
});

accessSync(path[, mode])
同步测试指定 path 的文件或目录的权限(0.3.9)。如果检查失败,将返回一个错误,否则,方法返回 undefined。
mode
一个可选整数,指定要执行的可访问性检查,默认为 fs.constants.F_OK
try {
    fs.accessSync('/file/path', fs.constants.R_OK | fs.constants.W_OK);
    console.log('has access');
} catch (e) {
    console.log('no access');)
}
appendFileSync(filename, data[, options])
同步将指定 data 附加到提供的 filename 文件中。data 预期为字符串或 Buffer 对象(0.4.4)。如果文件不存在,将被创建。options 参数预期为一个对象,包含以下键:
mode
模式选项,默认为 0o666
flag
文件系统 flag,默认为 a
closeSync(fd)
关闭由方法使用的整数表示的文件描述符 fd。返回 undefined
existsSync(path)
布尔值,如果指定的 path 存在,则返回 true。(0.8.2
fstatSync(fd)
检索文件描述符的 fs.Stats 对象(0.7.7)。fd 参数是方法使用的整数表示的文件描述符。
lstatSync(path[, options])
同步检索由 path 引用的符号链接的 fs.Stats 对象(0.7.1)。options 参数预期为一个对象,包含以下键:
throwIfNoEntry
一个布尔值,指示如果文件系统条目不存在是抛出异常还是返回 undefined,默认为 false
mkdirSync(path[, options])
同步在指定的 path 位置创建目录(0.4.2)。options 参数预期为一个指定 modeinteger,或一个包含以下键的对象:
mode
模式选项,默认为 0o777
openSync(path[, flags[, mode]])
返回打开文件 path 的文件描述符,表示为一个整数(0.7.7)。
flags
文件系统 flag,默认为 r
mode
模式选项,默认为 0o666
promises.open(path[, flags[, mode]])
返回一个表示打开文件 pathFileHandle 对象(0.7.7)。
flags
文件系统 flag,默认为 r
mode
模式选项,默认为 0o666
readdirSync(path[, options])
同步读取指定 path 目录的内容(0.4.2)。options 参数预期为一个指定 encoding 的字符串,或一个包含以下键的对象:
encoding
编码,默认为 utf8。编码可以是 utf8buffer0.4.4)。
withFileTypes
如果设置为 true,文件数组将包含 fs.Dirent 对象,默认为 false
readFileSync(filename[, options])
同步返回提供的 filename 文件内容。options 参数可以是指定编码的 string。如果指定了编码,则返回字符串,否则返回 Buffer 对象(0.4.4)。
0.4.4 版本之前,如果未指定编码,则返回 byte string
否则,options 预期为一个包含以下键的对象:
encoding
编码,默认为未指定。编码可以是 utf8hex0.4.4)、base640.4.4)、base64url0.4.4)。
flag
文件系统 flag,默认为 r
import fs from 'fs';

var file = fs.readFileSync('/file/path.tar.gz');
console.log(file.slice(0,2).toString('hex')) /* '1f8b' */
readlinkSync(path[, options])
使用 readlink(2) 同步获取符号链接 path 的内容(0.8.7)。options 参数可以是指定编码的字符串,或一个带有 encoding 属性的对象,指定用于传递给回调的路径的字符编码。如果 encodingbuffer,结果将作为 Buffer 对象返回,否则作为字符串返回。
readSync(fd, buffer, offset[, length[, position]])
使用文件描述符 fd 读取文件路径的内容,返回读取的字节数(0.7.7)。
buffer
buffer 值可以是 BufferTypedArrayDataView
offset
一个 integer,表示在 buffer 中写入数据的位置。
length
一个 integer,表示要读取的字节数。
position
指定从文件中开始读取的位置,值可以是 integernull,默认为 null。如果 positionnull,将从当前文件位置读取数据,并且文件位置将更新。如果 position 是一个 integer,文件位置将保持不变。
realpathSync(path[, options])
使用 realpath(3) 通过解析 ... 和符号链接来同步计算规范路径名。options 参数可以是指定编码的字符串,或一个带有编码属性的对象,指定用于传递给回调的路径的字符编码(0.3.9)。
renameSync(oldPath, newPath)
同步更改文件的名称或位置,从 oldPath 改为 newPath0.3.4)。
import fs from 'fs';

fs.renameSync('hello.txt', 'HelloWorld.txt');
rmdirSync(path)
同步移除指定 path 的目录(0.4.2)。
statSync(path,[ options])
同步检索指定 pathfs.Stats 对象(0.7.1)。path 可以是 stringbufferoptions 参数预期为一个对象,包含以下键:
throwIfNoEntry
一个布尔值,指示如果文件系统条目不存在是抛出异常还是返回 undefined,默认为 true
symlinkSync(target, path)
使用 symlink(2) 同步创建名为 path 指向 target 的链接(0.3.9)。相对目标是相对于链接的父目录。
unlinkSync(path)
通过 path 同步取消链接文件(0.3.9)。
writeFileSync(filename, data[, options])
同步将 data 写入提供的 filename 文件中。data 预期为字符串或 Buffer 对象(0.4.4)。如果文件不存在,将被创建;如果文件存在,将被替换。options 参数预期为一个对象,包含以下键:
mode
模式选项,默认为 0o666
flag
文件系统 flag,默认为 w
import fs from 'fs';

fs.writeFileSync('hello.txt', 'Hello world');
writeSync(fd, buffer, offset[, length[, position]])
使用文件描述符将 Buffer 写入文件,返回写入的字节 number0.7.7)。
fd
一个 integer,表示文件描述符。
buffer
buffer 值可以是 BufferTypedArrayDataView
offset
一个 integer,确定要写入的 Buffer 的哪一部分,默认为 0
length
一个 integer,指定要写入的字节数,默认为 Buffer.byteLength 的偏移量。
position
指从此数据应写入的文件开头的偏移量,可以是 integernull,默认为 null。另请参阅 pwrite(2)
writeSync(fd, string[, position[, encoding]])
使用文件描述符 fdstring 写入文件,返回写入的字节 number0.7.7)。
fd
一个 integer,表示文件描述符。
position
指从此数据应写入的文件开头的偏移量,可以是 integernull,默认为 null。另请参阅 pwrite(2)
encoding
一个 string,默认为 utf8

fs.Dirent

fs.Dirent 表示一个目录条目 — 一个文件或子目录。当调用带有 withFileTypes 选项的 readdirSync() 时,结果数组包含 fs.Dirent 对象。

  • dirent.isBlockDevice() — 如果 fs.Dirent 对象描述了一个块设备,则返回 true
  • dirent.isCharacterDevice() — 如果 fs.Dirent 对象描述了一个字符设备,则返回 true
  • dirent.isDirectory() — 如果 fs.Dirent 对象描述了一个文件系统目录,则返回 true
  • dirent.isFIFO() — 如果 fs.Dirent 对象描述了一个先进先出(FIFO)管道,则返回 true
  • dirent.isFile() — 如果 fs.Dirent 对象描述了一个普通文件,则返回 true
  • dirent.isSocket() — 如果 fs.Dirent 对象描述了一个套接字,则返回 true
  • dirent.isSymbolicLink() — 如果 fs.Dirent 对象描述了一个符号链接,则返回 true
  • dirent.namefs.Dirent 对象引用的文件名。

fs.FileHandle

filehandle.close()
filehandle.fd
filehandle.read()
filehandle.stat()
filehandle.write(buf)
filehandle.write(str)

FileHandle 对象是数字文件描述符的对象包装器(0.7.7)。FileHandle 对象的实例由 fs.promises.open() 方法创建。如果一个 FileHandle 没有使用 filehandle.close() 方法关闭,它会尝试自动关闭文件描述符,从而帮助防止内存泄漏。请不要依赖这种行为,因为它可能不可靠。相反,请始终显式关闭 FileHandle

filehandle.close()
等待该句柄上所有待处理的操作完成后,关闭文件句柄。返回一个 promise,成功时以 undefined 实现(fulfill)。
filehandle.fd
FileHandle 对象管理的数字文件描述符。
filehandle.read(buffer, offset[, length[, position]])
从文件读取数据并存储到给定的 buffer 中。
buffer
一个将被读取的文件数据填充的 buffer,值可以是 BufferTypedArrayDataView
offset
一个 integer,表示在 buffer 中开始填充数据的位置。
length
一个 integer,表示要读取的字节数。
position
从文件中开始读取数据的位置,值可以是 integernull。如果为 null,将从当前文件位置读取数据并更新位置。如果 position 是一个 integer,当前文件位置将保持不变。
返回一个 Promise,成功时以一个包含两个属性的对象实现:
bytesRead
一个 integer,表示读取的字节数。
buffer
对 buffer 中传入参数的引用,可以是 BufferTypedArrayDataView
filehandle.stat()
以文件的 fs.Stats 实现 Promise,返回一个 promise
filehandle.write(buffer, offset[, length[, position]])
将 buffer 写入文件。
buffer
buffer 值可以是 BufferTypedArrayDataView
offset
一个 integer,表示从 buffer 内部开始写入数据的位置。
length
一个 integer,表示要从 buffer 中写入的字节数,默认为 Buffer.byteLength 的偏移量。
position
从文件开头处写入 buffer 数据的偏移量,可以是 integernull,默认为 null。如果 position 不是一个 number,数据将写入当前位置。详细信息请参阅 POSIX pwrite(2) 文档。
返回一个 Promise,该 Promise 解析为一个包含两个属性的对象:
bytesWritten
一个 integer,表示写入的字节数。
buffer
对已写入 buffer 的引用,可以是 BufferTypedArrayDataView

在同一个文件上多次使用 filehandle.write() 而不等待 Promise 解析或拒绝是不安全的。

filehandle.write(string[, position[, encoding]])
string 写入文件。
position
从文件开头处写入 buffer 数据的偏移量,可以是 integernull,默认为 null。如果 position 不是一个 number,数据将写入当前位置。详细信息请参阅 POSIX pwrite(2) 文档。
encoding
字符串的预期编码,默认为 utf8
返回一个 Promise,该 Promise 解析为一个包含两个属性的对象:
bytesWritten
一个 integer,表示写入的字节数。
buffer
对已写入 buffer 的引用,可以是 BufferTypedArrayDataView

在同一个文件上多次使用 filehandle.write() 而不等待 Promise 解析或拒绝是不安全的。

fs.Stats

fs.Stats 对象提供文件信息。该对象由 fs.statSync()fs.lstatSync() 返回。

  • stats.isBlockDevice() — 如果 fs.Stats 对象描述了块设备,则返回 true
  • stats.isDirectory() — 如果 fs.Stats 对象描述了文件系统目录,则返回 true
  • stats.isFIFO() — 如果 fs.Stats 对象描述了先进先出(FIFO)管道,则返回 true
  • stats.isFile() — 如果 fs.Stats 对象描述了普通文件,则返回 true
  • stats.isSocket() — 如果 fs.Stats 对象描述了套接字,则返回 true
  • stats.isSymbolicLink() — 如果 fs.Stats 对象描述了符号链接,则返回 true
  • stats.dev — 包含文件的设备的数字标识符。
  • stats.ino — 文件的文件系统特定 Inode 号。
  • stats.mode — 一个位字段,描述文件类型和模式。
  • stats.nlink — 文件的硬链接数。
  • stats.uid — 拥有文件的用户的数字用户标识符(POSIX)。
  • stats.gid — 拥有文件的组的数字组标识符(POSIX)。
  • stats.rdev — 如果文件表示设备,则为数字设备标识符。
  • stats.size — 文件的字节大小。
  • stats.blksize — 用于 I/O 操作的文件系统块大小。
  • stats.blocks — 为此文件分配的块数。
  • stats.atimeMs — 指示自 POSIX Epoch 以来文件最后一次被访问的时间戳,以毫秒表示。
  • stats.mtimeMs — 指示自 POSIX Epoch 以来文件最后一次被修改的时间戳,以毫秒表示。
  • stats.ctimeMs — 指示自 POSIX Epoch 以来文件最后一次被更改的时间戳,以毫秒表示。
  • stats.birthtimeMs — 指示自 POSIX Epoch 以来文件创建的时间戳,以毫秒表示。
  • stats.atime — 指示文件最后一次被访问的时间戳。
  • stats.mtime — 指示文件最后一次被修改的时间戳。
  • stats.ctime — 指示文件最后一次被更改的时间戳。
  • stats.birthtime — 指示文件创建的时间戳。

File Access Constants

access() 方法可以接受以下标志。这些标志由 fs.constants 导出:

  • F_OK — 指示文件对调用进程可见,如果未指定模式,则默认使用此项。
  • R_OK — 指示文件可被调用进程读取。
  • W_OK — 表示文件可由调用进程写入
  • X_OK — 表示文件可由调用进程执行

File System Flags

flag 选项可接受以下值

  • a — 打开文件进行追加。如果文件不存在,则创建该文件
  • ax — 与 a 相同,但如果文件已存在则失败
  • a+ — 打开文件进行读写和追加。如果文件不存在,则将创建它
  • ax+ — 与 a+ 相同,但如果文件已存在则失败
  • as — 以同步模式打开文件进行追加。如果文件不存在,则将创建它
  • as+ — 以同步模式打开文件进行读写和追加。如果文件不存在,则将创建它
  • r — 打开文件进行读取。如果文件不存在,则会发生异常
  • r+ — 打开文件进行读写。如果文件不存在,则会发生异常
  • rs+ — 以同步模式打开文件进行读写。指示操作系统绕过本地文件系统缓存
  • w — 打开文件进行写入。如果文件不存在,则将创建它。如果文件存在,则将替换它
  • wx — 与 w 相同,但如果文件已存在则失败
  • w+ — 打开文件进行读写。如果文件不存在,则将创建它。如果文件存在,则将替换它
  • wx+ — 与 w+ 相同,但如果文件已存在则失败

Query String

querystring.decode()
querystring.encode()
querystring.escape()
querystring.parse()
querystring.stringify()
querystring.unescape()

Query String 模块提供了解析和格式化 URL 查询字符串的支持 (0.4.3)。使用以下方式导入 Query String 模块对象: import qs from 'querystring'

querystring.decode()
querystring.parse() 的别名。
querystring.encode()
querystring.stringify() 的别名。
querystring.escape(string)

对给定的 string 执行 URL 编码,返回一个转义的查询字符串。该方法由 querystring.stringify() 使用,不应直接使用。

querystring.parse(string[, separator[, equal[, options]]])

解析查询字符串 URL 并返回一个对象。

separator 参数是用于分隔查询字符串中键值对的子字符串,默认为“&”。

equal 参数是用于分隔查询字符串中键和值的子字符串,默认为“=”。

options 参数应该是一个具有以下键的对象

decodeURIComponent function
用于解码查询字符串中百分比编码字符的函数,默认为 querystring.unescape()
maxKeys number
要解析的最大键数,默认为 1000。值 0 删除键计数限制。

默认情况下,查询字符串中的百分比编码字符假定使用 UTF-8 编码,无效的 UTF-8 序列将被替换为 U+FFFD 替换字符。

例如,对于以下查询字符串

'foo=bar&abc=xyz&abc=123'

输出将是

{
  foo: 'bar',
  abc: ['xyz', '123']
}

querystring.stringify(object[, separator[, equal[, options]]])

序列化一个对象并返回一个 URL 查询字符串。

separator 参数是用于分隔查询字符串中键值对的子字符串,默认为“&”。

equal 参数是用于分隔查询字符串中键和值的子字符串,默认为“=”。

options 参数应该是一个具有以下键的对象

encodeURIComponent function
用于将查询字符串中 URL 不安全的字符转换为百分比编码的函数,默认为 querystring.escape()

默认情况下,查询字符串中需要百分比编码的字符编码为 UTF-8。如果需要其他编码,则应指定 encodeURIComponent 选项。

例如,对于以下命令

querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], 123: '' });

查询字符串将是

'foo=bar&baz=qux&baz=quux&123='

querystring.unescape(string)

string 的 URL 百分比编码字符执行解码,返回一个未转义的查询字符串。该方法由 querystring.parse() 使用,不应直接使用。

XML

xml.parse()
xml.c14n()
xml.exclusiveC14n()
xml.serialize()
xml.serializeToString()
XMLDoc
XMLNode
XMLAttr

XML 模块允许处理 XML 文档 (自 0.7.10 起)。使用以下方式导入 XML 模块对象: import 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)
解析 string 或 Buffer 以获取 XML 文档,返回表示解析后的 XML 文档的 XMLDoc 包装对象。
c14n(root_node[, excluding_node])
根据 Canonical XML Version 1.1root_node 及其子节点进行规范化。root_node 可以是围绕 XML 结构的 XMLNodeXMLDoc 包装对象。返回包含规范化输出的 Buffer 对象。

excluding_node
允许在输出中省略文档的一部分

exclusiveC14n(root_node[, excluding_node[, withComments [,prefix_list]]])
根据 Exclusive XML Canonicalization Version 1.0root_node 及其子节点进行规范化。

root_node
是围绕 XML 结构的 XMLNodeXMLDoc 包装对象
excluding_node
允许在输出中省略对应于该节点及其子节点的文档部分
withComments
一个布尔值,默认为 false。如果为 true,则规范化对应于 Exclusive XML Canonicalization Version 1.0 (带注释)。返回包含规范化输出的 Buffer 对象。
prefix_list
一个可选字符串,包含空格分隔的命名空间前缀,用于也应包含在输出中的命名空间

serialize()
xml.c14n() 相同 (自 0.7.11 起)。
serializeToString()
xml.c14n() 相同,但返回结果为 string (自 0.7.11 起)。
XMLDoc
围绕 XML 结构的 XMLDoc 包装对象,即文档的根节点。

doc.$root
按名称获取文档的根节点,或为 undefined
doc.abc
第一个名为 abc 的根标签,作为 XMLNode 包装对象

XMLNode
围绕 XML 标签节点的 XMLNode 包装对象。

node.abc
node.$tag$abc 相同
node.$attr$abc
节点 abc 的属性值,自 0.7.11 起可写入
node.$attr$abc=xyz
node.setAttribute('abc', xyz) 相同 (自 0.7.11 起)
node.$attrs
一个用于节点所有属性的 XMLAttr 包装对象
node.$name
节点的名称
node.$ns
节点的命名空间
node.$parent
当前节点的父节点
node.$tag$abc
节点中第一个名为 abc 的子标签,自 0.7.11 起可写入
node.$tags
所有子标签的数组
node.$tags = [node1, node2, ...]
node.removeChildren(); node.addChild(node1); node.addChild(node2) 相同 (自 0.7.11 起)。
node.$tags$abc
节点中所有名为 abc 的子标签,自 0.7.11 起可写入
node.$text
节点的内容,自 0.7.11 起可写入
node.$text = 'abc'
node.setText('abc') 相同 (自 0.7.11 起)
node.addChild(nd)
将 XMLNode 添加为节点的子节点 (自 0.7.11 起)。nd 在添加到节点之前会被递归复制
node.removeAllAttributes()
移除节点的所有属性 (自 0.7.11 起)
node.removeAttribute(attr_name)
移除名为 attr_name 的属性 (自 0.7.11 起)
node.removeChildren(tag_name)
移除所有名为 tag_name 的子标签 (自 0.7.11 起)。如果省略 tag_name,则移除所有子标签。
node.removeText()
移除节点的文本值 (0.7.11)
node.setAttribute(attr_name, value)
attr_name 设置值 (自 0.7.11 起)。当值为 null 时,名为 attr_name 的属性将被删除。
node.setText(value)
为节点设置文本值 (自 0.7.11 起)。当值为 null 时,节点的文本将被删除。

XMLAttr
围绕 XML 节点属性的 XMLAttrs 包装对象。

attr.abc
abc 的属性值

zlib

zlib.deflateRawSync()
zlib.deflateSync()
zlib.inflateRawSync()
zlib.inflateSync()

zlib 模块提供了使用“deflate”和“inflate”算法进行压缩的功能 (自 0.7.12 起)。使用以下方式导入 zlib 模块对象: import zlib from 'zlib'

deflateRawSync(string | Buffer[, options])
使用提供的 string 或 Buffer 数据,使用“deflate”算法进行压缩,且不附加 zlib 头部。Buffer 值可以是 BufferTypedArrayDataViewOptions 是一个可选对象,包含 zlib_options。返回包含压缩数据的 Buffer 实例。
deflateSync(string | Buffer[, options])
使用提供的 string 或 Buffer 数据,使用“deflate”算法进行压缩。Buffer 值可以是 BufferTypedArrayDataViewOptions 是一个可选对象,包含 zlib_options。返回包含压缩数据的 Buffer 实例。
inflateRawSync(string | Buffer)
使用“deflate”算法解压原始流。返回包含解压后数据的 Buffer 实例。
inflateSync(string | Buffer)
使用“deflate”算法解压流。返回包含解压后数据的 Buffer 实例。

zlib 选项

  • chunkSize — 是一个整数,默认为 1024
  • dictionary — 是 BufferTypedArrayDataView。默认为空
  • level — 是一个整数,仅用于压缩,参见 zlib_compression_levels
  • memLevel — 是一个介于 19 之间的整数,仅用于压缩
  • strategy — 是一个整数,仅用于压缩,参见 zlib_compression_strategy
  • windowBits — 对于原始数据,是一个介于 -15-9 之间的整数;对于普通流,是一个介于 915 之间的整数

zlib 压缩级别

名称描述
zlib.constants.Z_NO_COMPRESSION无压缩
zlib.constants.Z_BEST_SPEED最快,压缩量最小
zlib.constants.Z_DEFAULT_COMPRESSION速度和压缩之间的权衡
zlib.constants.Z_BEST_COMPRESSION最慢,压缩量最大

zlib 压缩策略

名称描述
zlib.constants.Z_FILTERED过滤策略: 用于过滤器或预测器产生的数据
zlib.constants.Z_HUFFMAN_ONLY仅哈夫曼策略: 仅使用哈夫曼编码,不进行字符串匹配
zlib.constants.Z_RLE游程编码策略: 将匹配距离限制为一,更适用于 PNG 图像数据压缩
zlib.constants.Z_FIXED固定表策略: 阻止使用动态哈夫曼编码,适用于特殊应用的更简单解码器
zlib.constants.Z_DEFAULT_STRATEGY默认策略,适用于通用压缩