nginx / current / reference / njs-reference.html

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.fooheadersIn['Foo']

“授权”,“内容长度”,“内容范围”,“Content Type”,“ ETag”,“期望”,“来自”,“主机”,“ If-Match”,“ If-Modified-从”,“如果没有匹配”,“如果范围”,“如果未经修改以来”,“最大转发”,“代理授权”,“推荐人”,“传输编码”和“用户” -Agent”请求 Headers 只能有一个字段值(0.4.1)。 “ Cookie”标题中重复的字段值用分号(;)分隔。所有其他请求 Headers 中的重复字段值均以逗号分隔。

r.headersOut{}

  • 传出 Headers 对象,可写。

可以使用以下语法访问“ Foo”响应头:headersOut.fooheadersOut['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]])

  • 使用给定的urioptions创建一个子请求,并安装可选的完成callback

subrequest与客户端请求共享其输入 Headers。要将不同于原始头的头发送到代理服务器,可以使用proxy_set_header指令。要将全新的 Headers 集发送到代理服务器,可以使用proxy_pass_request_headers指令。

如果options是字符串,则它包含子请求参数字符串。否则,options应该是具有以下键的对象:

  • args

    • 参数字符串,默认情况下使用空字符串

    • body

      • 请求正文,默认情况下使用父请求对象的请求正文
    • method

      • HTTP 方法,默认情况下使用GET方法
    • detached

      • 布尔标志(0.3.9),如果为true,则创建的子请求为分离的子请求。对分离的子请求的响应将被忽略。与普通的子请求不同,可以在变量处理程序内部创建分离的子请求。分离标志和回调参数是互斥的。

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

由于0.3.8,如果未提供callback,则返回解析为子请求响应对象的Promise对象。

r.uri

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)创建字节字符串。编码可以是hexbase64base64url
>> 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开始。如果找不到该值,则返回-1fromIndex是整数,默认值为 0.如果fromIndex小于 0 或大于String.prototype.length``,则搜索从索引0String.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]])

  • 返回一个新的字符串,该字符串具有匹配的模式(stringregexp),并替换为stringfunction
>> 'abcdefgh'.replace('d', 1)
'abc1efgh'

String.prototype.search([regexp])

  • 使用regexp搜索字符串
>> 'abcdefgh'.search('def')
3

String.prototype.slice(start[, end])

  • 返回一个新字符串,其中包含startend之间或从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])

  • startstart返回指定的length字符串的一部分到字符串的末尾。
>>  'abcdefghijklmno'.substr(3, 5)
'defgh'

String.prototype.substring(start[, end])

  • 返回介于startend之间或从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编码为hexbase64base64url

>>  'αβγδ'.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)

>> 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参数通常是将要转换的 JSON objectarray。如果该值具有toJSON()方法,则它定义对象的序列化方式。可选的replacer参数是用于转换结果的functionarray。可选的space参数是stringnumber。如果它是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生成哈希摘要。该算法可以是md5sha1sha256

crypto.createHmac(算法,密钥)

  • 创建并返回使用给定的algorithmsecret keyHMAC对象。该算法可以是md5sha1sha256

Hash

  • hash.update(data)

    • 使用给定的data更新哈希内容。
  • hash.digest([encoding])

    • 计算使用hash.update()传递的所有数据的摘要。编码可以是hexbase64base64url。如果未提供编码,则返回字节字符串。
>> 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 摘要。编码可以是hexbase64base64url。如果未提供编码,则返回字节字符串。
>> var cr = require('crypto')
undefined

>> cr.createHmac('sha1', 'secret.key').update('AB').digest('base64url')
'Oglm93xn23_MkiaEq_e9u8zk374'

Timers

clearTimeout(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

mkdirSync(path[, options])

  • 在指定的path(0.4.2)上同步创建目录。 options参数应为指定modeinteger或具有以下键的对象:

mode

 - mode option, by default is  `0o777` \.

readdirSync(path[, options])

  • 同步读取指定path(0.4.2)处目录的内容。 options参数应为指定encoding的字符串或具有以下键的对象:

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
>> 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
>> 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+相同,但是如果文件已存在则失败