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']
]
可以使用以下语法收集所有foo
Headers:
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
模式选项,默认为
0o666
flag
- 文件系统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
编码,默认情况下未指定。编码可以是
utf8
flag
- 文件系统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
模式选项,默认为
0o666
flag
- 文件系统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+
相同,但是如果文件已存在则失败