On this page
Reference
njs提供用于扩展 nginx 功能的对象,方法和属性。
nginx objects
HTTP Request
HTTP 请求对象仅在ngx_http_js_module模块中可用。对象的所有字符串属性均为byte strings。
r.args{}
请求参数对象,只读
r.error(string)- 在记录的
error级别上将string写入错误日志
- 在记录的
r.finish()- 完成向客户端发送响应
r.headersIn{}
- 传入的 Headers 对象,只读。
可以使用以下语法访问Foo请求 Headers:headersIn.foo或headersIn['Foo']。
“授权”,“内容长度”,“内容范围”,“Content Type”,“ ETag”,“期望”,“来自”,“主机”,“ If-Match”,“ If-Modified-从”,“如果没有匹配”,“如果范围”,“如果未经修改以来”,“最大转发”,“代理授权”,“推荐人”,“传输编码”和“用户” -Agent”请求 Headers 只能有一个字段值(0.4.1)。 “ Cookie”标题中重复的字段值用分号(;)分隔。所有其他请求 Headers 中的重复字段值均以逗号分隔。
r.headersOut{}
- 传出 Headers 对象,可写。
可以使用以下语法访问“ Foo”响应头:headersOut.foo或headersOut['Foo']。
可以使用以下语法设置多值响应 Headers(0.4.0)的字段值:
r.headersOut['Foo'] = ['a', 'b']
输出将是:
Foo: a
Foo: b
“ Foo”响应标题的所有先前字段值将被删除。
对于仅接受单个字段值(例如“ Content-Type”)的标准响应 Headers,只有数组的最后一个元素才会生效。 “ Set-Cookie”响应 Headers 的字段值始终以数组形式返回。 “ Age”,“ Content-Encoding”,“ Content-Length”,“ Content-Type”,“ ETag”,“ Expires”,“ Last-Modified”,“ Location”,“ Retry-After”响应中的字段值重复 Headers 将被忽略。所有其他响应 Headers 中的重复字段值均以逗号分隔。
r.httpVersion- HTTP 版本,只读
r.internalRedirect(uri)
执行内部重定向到指定的
uri。如果 uri 以“@”前缀开头,则将其视为命名位置。实际的重定向发生在处理程序执行完成之后。r.log(string)- 在记录的
info级别上将string写入错误日志
- 在记录的
r.method- HTTP 方法,只读
r.parent
引用父请求对象
r.remoteAddress- 客户地址,只读
r.rawHeadersIn{}
- 返回键值对的数组,该键值对与从客户端(0.4.1)收到的键值对完全相同。
例如,具有以下请求 Headers:
Host: localhost
Foo: bar
foo: bar2
r.rawHeadersIn的输出为:
[
['Host', 'localhost'],
['Foo', 'bar'],
['foo', 'bar2']
]
可以使用以下语法收集所有fooHeaders:
r.rawHeadersIn.filter(v=>v[0].toLowerCase() == 'foo').map(v=>v[1])
输出将是:
['bar', 'bar2']
标题字段名称不会转换为小写,重复的字段值不会合并。
r.rawHeadersOut{}
- 返回响应 Headers(0.4.1)的键值对数组。标题字段名称不会转换为小写,重复的字段值不会合并。
r.requestBody
- 如果尚未将客户请求主体写入临时文件,则返回该请求主体。为确保客户端请求主体在内存中,其大小应受client_max_body_size限制,并应使用client_body_buffer_size设置足够的缓冲区大小。该属性仅在js_content指令中可用。
r.responseBody
保留subrequest响应正文(只读)。
r.responseBody的大小受subrequest_output_buffer_size指令限制。r.return(status[, string])- 将带有指定的
status的整个响应发送给客户端
- 将带有指定的
可以指定重定向 URL(对于代码 301、302、303、307 和 308)或响应正文(对于其他代码)作为第二个参数
r.send(string)- 将响应主体的一部分发送给客户端
r.sendHeader()- 将 HTTP Headers 发送到客户端
r.status- status, writable
r.subrequest(uri[, options[, callback]])
- 使用给定的
uri和options创建一个子请求,并安装可选的完成callback。
subrequest与客户端请求共享其输入 Headers。要将不同于原始头的头发送到代理服务器,可以使用proxy_set_header指令。要将全新的 Headers 集发送到代理服务器,可以使用proxy_pass_request_headers指令。
如果options是字符串,则它包含子请求参数字符串。否则,options应该是具有以下键的对象:
args参数字符串,默认情况下使用空字符串
body- 请求正文,默认情况下使用父请求对象的请求正文
method- HTTP 方法,默认情况下使用
GET方法
- HTTP 方法,默认情况下使用
detached- 布尔标志(0.3.9),如果为
true,则创建的子请求为分离的子请求。对分离的子请求的响应将被忽略。与普通的子请求不同,可以在变量处理程序内部创建分离的子请求。分离标志和回调参数是互斥的。
- 布尔标志(0.3.9),如果为
完成callback接收一个子请求响应对象,该对象的方法和属性与父请求对象相同。
由于0.3.8,如果未提供callback,则返回解析为子请求响应对象的Promise对象。
r.uri
- 当前URI请求,normalized,只读
r.variables{}
nginx 变量对象,可写(自0.2.8以来)
r.warn(string)- 在记录的
warning级别上将string写入错误日志
- 在记录的
Stream Session
流会话对象仅在ngx_stream_js_module模块中可用。对象的所有字符串属性均为byte strings。
s.allow()
- 成功完成阶段处理程序(0.2.4)
s.decline()
- 完成阶段处理程序并将控制权传递给下一个处理程序(0.2.4)
s.deny()
- 使用访问错误代码(0.2.4)完成阶段处理程序
s.done( [code])
成功完成当前阶段处理程序或使用指定的数字代码(0.2.4)完成它。
s.error(string)- 在日志记录
error级别上将已发送的string写入错误日志
- 在日志记录
s.log(string)- 在日志记录
info级别上将已发送的string写入错误日志
- 在日志记录
s.off(eventName)
s.on(event, callback)
- 为指定的
event(0.2.4)注册一个callback。
event可能是以下字符串之一:
upload来自客户端的新数据
download- 给客户的新数据
完成回调具有以下原型:callback(data, flags),其中data是字符串,flags是具有以下属性的对象:
last
- a boolean value, true if data is a last buffer\.
s.remoteAddress- 客户地址,只读
s.send(data[, options])
将数据发送到客户端(0.2.4)。
options是用于覆盖从传入数据块缓冲区派生的 nginx 缓冲区标志的对象。这些标志可以用以下标志覆盖:last布尔值,如果缓冲区是最后一个缓冲区,则为 true
flush- 布尔值,如果缓冲区应具有
flush标志,则为 true
- 布尔值,如果缓冲区应具有
每次回调调用可以多次调用该方法。
s.variables{}
nginx 变量对象,可写(自0.2.8以来)
s.warn(string)- 在日志记录
warning级别上将已发送的string写入错误日志
- 在日志记录
Core
Global
Process
process对象是一个全局对象,提供有关当前进程(0.3.3)的信息。
process.argv
- 返回一个数组,其中包含启动当前进程时传递的命令行参数。
process.env
- 返回一个包含用户环境的对象。
Note
默认情况下,nginx 会删除从其父进程继承的所有环境变量(TZ 变量除外)。使用env指令保留一些继承的变量。
process.pid
- 返回当前进程的 PID。
process.ppid
- 返回当前父进程的 PID。
Object
Object构造函数对应于标准 JS 对象。
Object.entries(object)
- 返回给定
object(0.2.7)的所有可枚举属性[key, value]对的数组。
Object.values(object)
- 返回给定
object(0.2.7)的所有可枚举属性值的数组。
String
njs 中有两种类型的字符串:Unicode 字符串(默认)和字节字符串。
Unicode 字符串对应于包含 Unicode 字符的 ECMAScript 字符串。
字节字符串包含一个字节序列,用于将 Unicode 字符串序列化为外部数据并从外部源反序列化。例如,toUTF8()方法使用 UTF8 编码将 Unicode 字符串序列化为字节字符串:
>> '£'.toUTF8().toString('hex')
'c2a3' /* C2 A3 is the UTF8 representation of 00A3 ('£') code point */
toBytes()方法将代码点最多为 255 的 Unicode 字符串序列化为字节字符串,否则返回null:
>> '£'.toBytes().toString('hex')
'a3' /* a3 is a byte equal to 00A3 ('£') code point */
只能将字节字符串转换为不同的编码。例如,字符串不能直接编码为hex:
>> 'αβγδ'.toString('base64')
TypeError: argument must be a byte string
at String.prototype.toString (native)
at main (native)
要将 Unicode 字符串转换为十六进制,首先,应将其转换为字节字符串,然后再转换为十六进制:
>> 'αβγδ'.toUTF8().toString('base64')
'zrHOss6zzrQ='
String.bytesFrom(数组|字符串,编码)
- (特定于 njs)从包含八位字节的数组或从编码的字符串(0.2.3)创建字节字符串。编码可以是
hex,base64和base64url。
>> String.bytesFrom([0x62, 0x75, 0x66, 0x66, 0x65, 0x72])
'buffer'
>> String.bytesFrom('YnVmZmVy', 'base64')
'buffer'
String.fromCharCode(CharCode1[, ...[, CharCodeN]])
- 从一个或多个 Unicode 代码点返回一个字符串。
>> String.fromCharCode(97, 98, 99, 100)
'abcd'
String.fromCodePoint(codePoint1[, ...[, codePoint2]])
- 从一个或多个 Unicode 代码点返回一个字符串。
>> String.fromCodePoint(97, 98, 99, 100)
'abcd'
String.prototype.charAt(index)
- 返回一个字符串,该字符串表示指定的
index处的一个 Unicode 代码单元;如果索引超出范围,则为空字符串。索引可以是 0 到 1 之间的整数,小于字符串的长度。如果未提供索引,则默认值为0,因此返回字符串中的第一个字符。
String.prototype.CodePointAt(position)
- 返回一个数字,该数字表示给定
position处字符的代码点值;undefined,如果位置上没有元素。
>> 'ABCD'.codePointAt(3);
68
String.prototype.concat(string1[,...,字符串 N])
- 返回一个字符串,其中包含指定的
strings的串联。
>> "a".concat("b", "c")
'abc'
String.prototype.endsWith(searchString[, length])
- 如果字符串以指定字符串的字符结尾,则返回
true,否则返回false。可选的length参数是字符串的长度。如果省略,则默认值为字符串的长度。
>> 'abc'.endsWith('abc')
true
>> 'abca'.endsWith('abc')
false
String.prototype.fromBytes(start[, end])
- (特定于 njs)从字节字符串返回一个新的 Unicode 字符串,其中每个字节均被一个对应的 Unicode 代码点替换。
String.prototype.fromUTF8(start[, end])
- (特定于 njs)将包含有效 UTF8 字符串的字节字符串转换为 Unicode 字符串,否则返回
null。
String.prototype.includes(searchString[, position]))
- 如果在另一个字符串中找到一个字符串,则返回
true,否则返回false。可选的position参数是字符串中开始搜索searchString的位置。预设值为 0.
>> 'abc'.includes('bc')
true
String.prototype.indexOf(searchString[, fromIndex])
- 返回第一次出现
searchString的位置。搜索从fromIndex开始。如果找不到该值,则返回-1。fromIndex是整数,默认值为 0.如果fromIndex小于 0 或大于String.prototype.length``,则搜索从索引0和String.prototype.length开始。
>> 'abcdef'.indexOf('de', 2)
3
String.prototype.lastIndexOf(searchString[, fromIndex])
- 返回上一次出现的
searchString的位置,从fromIndex向后搜索。如果找不到该值,则返回-1。如果searchString为空,则返回fromIndex。
>> "nginx".lastIndexOf("gi")
1
String.prototype.length
- 返回字符串的长度。
>> 'αβγδ'.length
4
String.prototype.match([regexp])
- 将字符串与
regexp匹配。
>> 'nginx'.match( /ng/i )
'ng'
String.prototype.padEnd(length [, string])
- 返回指定的
length的字符串,并在指定的字符串(0.2.3)的末尾加上填充符string。
>> '1234'.padEnd(8, 'abcd')
'1234abcd'
String.prototype.padStart(length [, string])
- 返回指定的
length的字符串,并将填充符string应用于指定的字符串(0.2.3)的开头。
>> '1234'.padStart(8, 'abcd')
'abcd1234'
String.prototype.repeat(number)
- 返回具有指定字符串副本
number的字符串。
>> 'abc'.repeat(3)
'abcabcabc'
String.prototype.replace([regexp|string[, string|function]])
- 返回一个新的字符串,该字符串具有匹配的模式(
string或regexp),并替换为string或function。
>> 'abcdefgh'.replace('d', 1)
'abc1efgh'
String.prototype.search([regexp])
- 使用
regexp搜索字符串
>> 'abcdefgh'.search('def')
3
String.prototype.slice(start[, end])
- 返回一个新字符串,其中包含
start和end之间或从start到字符串末尾的原始字符串的一部分。
>> 'abcdefghijklmno'.slice(NaN, 5)
'abcde'
String.prototype.split(([string|regexp[, limit]]))
- 返回与
regexp匹配的字符串。可选的limit参数是一个整数,它指定要找到的分割数的限制。
>> 'abc'.split('')
[
'a',
'b',
'c'
]
String.prototype.startsWith(searchString[, position])
- 如果字符串以指定字符串的字符开头,则返回
true,否则返回false。可选的position参数是此字符串中开始搜索searchString的位置。预设值为 0.
>> 'abc'.startsWith('abc')
true
> 'aabc'.startsWith('abc')
false
String.prototype.substr(start[, length])
- 从
start或start返回指定的length字符串的一部分到字符串的末尾。
>> 'abcdefghijklmno'.substr(3, 5)
'defgh'
String.prototype.substring(start[, end])
- 返回介于
start和end之间或从start到字符串末尾的字符串部分。
>> 'abcdefghijklmno'.substring(3, 5)
'de'
String.prototype.toBytes(start[, end])
- (特定于 njs)将 Unicode 字符串序列化为字节字符串。如果在字符串中找到大于 255 的字符,则返回
null。
String.prototype.toLowerCase()
- 将字符串转换为小写。该方法仅支持简单的 Unicode 折叠。
>> 'ΑΒΓΔ'.toLowerCase()
'αβγδ'
String.prototype.toString([encoding])- 如果未指定
encoding,则返回与 ECMAScript 中相同的指定 Unicode 字符串或字节字符串。
- 如果未指定
(特定于 njs)如果指定encoding,则将byte string编码为hex,base64或base64url。
>> 'αβγδ'.toUTF8().toString('base64url')
'zrHOss6zzrQ'
String.prototype.toUpperCase()
- 将字符串转换为大写。该方法仅支持简单的 Unicode 折叠。
>> 'αβγδ'.toUpperCase()
'ΑΒΓΔ'
String.prototype.toUTF8(start[, end])
- (特定于 njs)使用 UTF8 编码将 Unicode 字符串序列化为字节字符串。
>> 'αβγδ'.toUTF8().length
8
>> 'αβγδ'.length
4
String.prototype.trim()
- 从字符串的两端删除空格。
>> ' abc '.trim()
'abc'
String.prototype.trimEnd()
- 从字符串(0.3.4)末尾删除空格。
>> ' abc '.trimEnd()
' abc'
String.prototype.trimStart()
- 从字符串的开头(0.3.4)删除空格。
>> ' abc '.trimStart()
'abc '
encodeURI(URI)
- 通过用表示字符的 UTF-8 编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来对 URI 进行编码
>> encodeURI('012αβγδ')
'012%CE%B1%CE%B2%CE%B3%CE%B4'
encodeURIComponent(encodedURIString)
- 通过用表示字符的 UTF-8 编码的一个,两个,三个或四个转义序列替换某些字符的每个实例来对 URI 进行编码。
>> encodeURIComponent('[@?=')
'%5B%40%3F%3D'
decodeURI(encodedURI)
- 解码以前的encoded URI。
>> decodeURI('012%CE%B1%CE%B2%CE%B3%CE%B4')
'012αβγδ'
decodeURIComponent(decodedURIString)
- 解码先前编码的 URI 的编码组件。
>> decodeURIComponent('%5B%40%3F%3D')
'[@?='
TypedArray
TypedArray是许多不同的全局属性,其值是特定元素类型的类型化数组构造函数。
TypedArray.prototype.sort()
- 对类型化数组的元素进行数字排序,并返回更新的类型化数组(0.4.2)。
JSON
JSON对象(ES 5.1)提供了用于将 njs 值与 JSON 格式相互转换的功能。
JSON.parse(string[, reviver])
- 将表示 JSON 数据的
string转换为 njs 对象({...})或数组([...])。可选的reviver参数是将对每个(键,值)对调用的函数(键,值),并且可以转换该值。
JSON.stringify(value[, replacer] [, space])
- 将 njs 对象转换回 JSON。必填
value参数通常是将要转换的 JSONobject或array。如果该值具有toJSON()方法,则它定义对象的序列化方式。可选的replacer参数是用于转换结果的function或array。可选的space参数是string或number。如果它是number,则表示结果前放置的空格数(不超过 10)。如果它是string,它将用作空白(或其前 10 个字符)。如果省略或为null,则不使用空格。
>> var json = JSON.parse('{"a":1, "b":true}')
>> json.a
1
>> JSON.stringify(json)
'{"a":1,"b":true}'
>> JSON.stringify({ x: [10, undefined, function(){}] })
'{"x":[10,null,null]}'
>> JSON.stringify({"a":1, "toJSON": function() {return "xxx"}})
'"xxx"'
# Example with function replacer
>> function replacer(key, value) {return (typeof value === 'string') ? undefined : value}
>>JSON.stringify({a:1, b:"b", c:true}, replacer)
'{"a":1,"c":true}'
Crypto
加密模块提供加密功能支持。加密模块对象由require('crypto')返回。
crypto.createHash(algorithm)
- 创建并返回一个Hash对象,该对象可用于使用给定的
algorithm生成哈希摘要。该算法可以是md5,sha1和sha256。
crypto.createHmac(算法,密钥)
- 创建并返回使用给定的
algorithm和secret key的HMAC对象。该算法可以是md5,sha1和sha256。
Hash
hash.update(data)- 使用给定的
data更新哈希内容。
- 使用给定的
hash.digest([encoding])- 计算使用
hash.update()传递的所有数据的摘要。编码可以是hex,base64和base64url。如果未提供编码,则返回字节字符串。
- 计算使用
>> var cr = require('crypto')
undefined
>> cr.createHash('sha1').update('A').update('B').digest('base64url')
'BtlFlCqiamG-GMPiK_GbvKjdK10'
HMAC
hmac.update(data)- 使用给定的
data更新 HMAC 内容。
- 使用给定的
hmac.digest([encoding])- 计算使用
hmac.update()传递的所有数据的 HMAC 摘要。编码可以是hex,base64和base64url。如果未提供编码,则返回字节字符串。
- 计算使用
>> var cr = require('crypto')
undefined
>> cr.createHmac('sha1', 'secret.key').update('AB').digest('base64url')
'Oglm93xn23_MkiaEq_e9u8zk374'
Timers
clearTimeout(timeout)
- 取消由setTimeout()创建的
timeout对象。
setTimeout(function, ms[,arg1,argN])
- 在指定数量的
milliseconds之后调用function。可以将一个或多个可选arguments传递给指定的函数。返回一个timeout对象。
function handler(v)
{
// ...
}
t = setTimeout(handler, 12);
// ...
clearTimeout(t);
File System
文件系统模块提供文件操作。
模块对象由require('fs')返回。由于0.3.9,因此可以通过require('fs').promises对象获得文件系统方法的授权版本:
> var fs = require('fs').promises;
undefined
> fs.readFile("/file/path").then((data)=>console.log(data))
<file data>
accessSync(path[, mode])
同步测试
path(0.3.9)中指定的文件或目录的权限。如果检查失败,将返回错误,否则,该方法将返回未定义。mode- 默认情况下为fs.constants.F_OK。 mode 参数是一个可选的整数,它指定要执行的可访问性检查。
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的文件中。如果文件不存在,将创建它。options参数应该是具有以下键的对象:mode模式选项,默认为
0o666flag- 文件系统flag,默认为
a
- 文件系统flag,默认为
mkdirSync(path[, options])
mode
- mode option, by default is `0o777` \.
readdirSync(path[, options])
encoding
- encoding, by default is not specified\. The encoding can be `utf8` \.
withFileTypes
- if set to `true` , the files array will contain [fs\.Dirent](njs-reference.html#fs_dirent) objects, by default is `false` \.
readFileSync(filename[, options])
同步返回提供的
filename的文件内容。options参数包含指定编码的string。如果未指定,则返回byte string。如果指定了utf8编码,则返回 Unicode 字符串。否则,options应该是具有以下键的对象:encoding编码,默认情况下未指定。编码可以是
utf8flag- 文件系统flag,默认为
r
- 文件系统flag,默认为
>> var fs = require('fs')
undefined
>> var file = fs.readFileSync('/file/path.tar.gz')
undefined
>> var gzipped = /^\x1f\x8b/.test(file); gzipped
true
realpathSync(path[, options])
- 通过使用realpath(3)解析
.,..和符号链接来同步计算规范路径名。options参数可以是指定编码的字符串,也可以是具有 encoding 属性的对象,该对象指定要用于传递给回调(0.3.9)的路径的字符编码。
renameSync(oldPath, newPath)
- 同步将文件的名称或位置从
oldPath更改为newPath(0.3.4)。
>> var fs = require('fs')
undefined
>> var file = fs.renameSync('hello.txt', 'HelloWorld.txt')
undefined
rmdirSync(path)
- 同步删除指定的
path(0.4.2)上的目录。
symlinkSync(target, path)
- 使用symlink(2)(0.3.9)同步创建指向
target的名为path的链接。相对目标相对于链接的父目录。
unlinkSync(path)
- 通过
path(0.3.9)同步取消链接文件。
writeFileSync(filename, data[, options])
将
data同步写入具有filename的文件。如果文件不存在,将创建它;如果文件存在,将被替换。options参数应该是具有以下键的对象:mode模式选项,默认为
0o666flag- 文件系统flag,默认为
w
- 文件系统flag,默认为
>> var fs = require('fs')
undefined
>> var file = fs.writeFileSync('hello.txt', 'Hello world')
undefined
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.name—文件fs.Dirent对象的名称。
文件访问常量
access()方法可以接受以下标志。这些标志由fs.constants导出:
F_OK—表示文件对调用过程可见,如果未指定模式,则默认使用R_OK-表示调用过程可以读取文件W_OK—表示可以由调用过程写入文件X_OK—表示可以由调用过程执行文件
文件系统标志
flag选项可以接受以下值:
a—打开要附加的文件。如果文件不存在,则创建该文件ax-与a相同,但是如果文件已存在则失败a+—打开文件进行读取和附加。如果文件不存在,将创建它ax+-与a+相同,但是如果文件已存在则失败as—打开一个文件以同步方式添加。如果文件不存在,将创建它as+—打开文件以同步模式读取和追加。如果文件不存在,将创建它r—打开文件进行读取。如果文件不存在,则会发生异常r+—打开文件进行读写。如果文件不存在,则会发生异常rs+—打开文件以同步模式进行读写。指示 os 绕过本地文件系统缓存w—打开要写入的文件。如果文件不存在,将创建它。如果文件存在,它将被替换wx-与w相同,但是如果文件已存在则失败w+—打开文件进行读写。如果文件不存在,将创建它。如果文件存在,它将被替换wx+-与w+相同,但是如果文件已存在则失败