- Assertion Testing
- Buffer
- C/C++ Addons
- Child Processes
- Cluster
- Command Line Options
- Console
- Crypto
- Debugger
- DNS
- Domain
- Errors
- Events
- File System
- Globals
- HTTP
- HTTPS
- Modules
- Net
- OS
- Path
- Process
- Punycode
- Query Strings
- Readline
- REPL
- Stream
- String Decoder
- Timers
- TLS/SSL
- TTY
- UDP/Datagram
- URL
- Utilities
- V8
- VM
- ZLIB
Node.js v6.10.0 Documentation
Table of Contents
- About this Documentation
- Usage
- Addons
- Assert
- assert(value[, message])
- assert.deepEqual(actual, expected[, message])
- assert.deepStrictEqual(actual, expected[, message])
- assert.doesNotThrow(block[, error][, message])
- assert.equal(actual, expected[, message])
- assert.fail(actual, expected, message, operator)
- assert.ifError(value)
- assert.notDeepEqual(actual, expected[, message])
- assert.notDeepStrictEqual(actual, expected[, message])
- assert.notEqual(actual, expected[, message])
- assert.notStrictEqual(actual, expected[, message])
- assert.ok(value[, message])
- assert.strictEqual(actual, expected[, message])
- assert.throws(block[, error][, message])
- Buffer
Buffer.from(),Buffer.alloc(), andBuffer.allocUnsafe()- Buffers and Character Encodings
- Buffers and TypedArray
- Buffers and ES6 iteration
- Class: Buffer
- new Buffer(array)
- new Buffer(buffer)
- new Buffer(arrayBuffer[, byteOffset [, length]])
- new Buffer(size)
- new Buffer(string[, encoding])
- Class Method: Buffer.alloc(size[, fill[, encoding]])
- Class Method: Buffer.allocUnsafe(size)
- Class Method: Buffer.allocUnsafeSlow(size)
- Class Method: Buffer.byteLength(string[, encoding])
- Class Method: Buffer.compare(buf1, buf2)
- Class Method: Buffer.concat(list[, totalLength])
- Class Method: Buffer.from(array)
- Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
- Class Method: Buffer.from(buffer)
- Class Method: Buffer.from(string[, encoding])
- Class Method: Buffer.isBuffer(obj)
- Class Method: Buffer.isEncoding(encoding)
- Class Property: Buffer.poolSize
- buf[index]
- buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])
- buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])
- buf.entries()
- buf.equals(otherBuffer)
- buf.fill(value[, offset[, end]][, encoding])
- buf.indexOf(value[, byteOffset][, encoding])
- buf.includes(value[, byteOffset][, encoding])
- buf.keys()
- buf.lastIndexOf(value[, byteOffset][, encoding])
- buf.length
- buf.readDoubleBE(offset[, noAssert])
- buf.readDoubleLE(offset[, noAssert])
- buf.readFloatBE(offset[, noAssert])
- buf.readFloatLE(offset[, noAssert])
- buf.readInt8(offset[, noAssert])
- buf.readInt16BE(offset[, noAssert])
- buf.readInt16LE(offset[, noAssert])
- buf.readInt32BE(offset[, noAssert])
- buf.readInt32LE(offset[, noAssert])
- buf.readIntBE(offset, byteLength[, noAssert])
- buf.readIntLE(offset, byteLength[, noAssert])
- buf.readUInt8(offset[, noAssert])
- buf.readUInt16BE(offset[, noAssert])
- buf.readUInt16LE(offset[, noAssert])
- buf.readUInt32BE(offset[, noAssert])
- buf.readUInt32LE(offset[, noAssert])
- buf.readUIntBE(offset, byteLength[, noAssert])
- buf.readUIntLE(offset, byteLength[, noAssert])
- buf.slice([start[, end]])
- buf.swap16()
- buf.swap32()
- buf.swap64()
- buf.toString([encoding[, start[, end]]])
- buf.toJSON()
- buf.values()
- buf.write(string[, offset[, length]][, encoding])
- buf.writeDoubleBE(value, offset[, noAssert])
- buf.writeDoubleLE(value, offset[, noAssert])
- buf.writeFloatBE(value, offset[, noAssert])
- buf.writeFloatLE(value, offset[, noAssert])
- buf.writeInt8(value, offset[, noAssert])
- buf.writeInt16BE(value, offset[, noAssert])
- buf.writeInt16LE(value, offset[, noAssert])
- buf.writeInt32BE(value, offset[, noAssert])
- buf.writeInt32LE(value, offset[, noAssert])
- buf.writeIntBE(value, offset, byteLength[, noAssert])
- buf.writeIntLE(value, offset, byteLength[, noAssert])
- buf.writeUInt8(value, offset[, noAssert])
- buf.writeUInt16BE(value, offset[, noAssert])
- buf.writeUInt16LE(value, offset[, noAssert])
- buf.writeUInt32BE(value, offset[, noAssert])
- buf.writeUInt32LE(value, offset[, noAssert])
- buf.writeUIntBE(value, offset, byteLength[, noAssert])
- buf.writeUIntLE(value, offset, byteLength[, noAssert])
- buffer.INSPECT_MAX_BYTES
- buffer.kMaxLength
- Class: SlowBuffer
- Child Process
- Asynchronous Process Creation
- Synchronous Process Creation
- Class: ChildProcess
maxBufferand Unicode
- Cluster
- How It Works
- Class: Worker
- Event: 'disconnect'
- Event: 'error'
- Event: 'exit'
- Event: 'listening'
- Event: 'message'
- Event: 'online'
- worker.disconnect()
- worker.exitedAfterDisconnect
- worker.id
- worker.isConnected()
- worker.isDead()
- worker.kill([signal='SIGTERM'])
- worker.process
- worker.send(message[, sendHandle][, callback])
- worker.suicide
- Event: 'disconnect'
- Event: 'exit'
- Event: 'fork'
- Event: 'listening'
- Event: 'message'
- Event: 'online'
- Event: 'setup'
- cluster.disconnect([callback])
- cluster.fork([env])
- cluster.isMaster
- cluster.isWorker
- cluster.schedulingPolicy
- cluster.settings
- cluster.setupMaster([settings])
- cluster.worker
- cluster.workers
- Command Line Options
- Synopsis
- Options
-v,--version-h,--help-e,--eval "script"-p,--print "script"-c,--check-i,--interactive-r,--require module--no-deprecation--trace-deprecation--throw-deprecation--no-warnings--trace-warnings--trace-sync-io--zero-fill-buffers--preserve-symlinks--track-heap-objects--prof-process--v8-options--tls-cipher-list=list--enable-fips--force-fips--openssl-config=file--icu-data-dir=file
- Environment Variables
- Console
- Asynchronous vs Synchronous Consoles
- Class: Console
- new Console(stdout[, stderr])
- console.assert(value[, message][, ...args])
- console.dir(obj[, options])
- console.error([data][, ...args])
- console.info([data][, ...args])
- console.log([data][, ...args])
- console.time(label)
- console.timeEnd(label)
- console.trace(message[, ...args])
- console.warn([data][, ...args])
- Crypto
- Determining if crypto support is unavailable
- Class: Certificate
- Class: Cipher
- Class: Decipher
- Class: DiffieHellman
- diffieHellman.computeSecret(other_public_key[, input_encoding][, output_encoding])
- diffieHellman.generateKeys([encoding])
- diffieHellman.getGenerator([encoding])
- diffieHellman.getPrime([encoding])
- diffieHellman.getPrivateKey([encoding])
- diffieHellman.getPublicKey([encoding])
- diffieHellman.setPrivateKey(private_key[, encoding])
- diffieHellman.setPublicKey(public_key[, encoding])
- diffieHellman.verifyError
- Class: ECDH
- Class: Hash
- Class: Hmac
- Class: Sign
- Class: Verify
cryptomodule methods and properties- crypto.constants
- crypto.DEFAULT_ENCODING
- crypto.fips
- crypto.createCipher(algorithm, password)
- crypto.createCipheriv(algorithm, key, iv)
- crypto.createCredentials(details)
- crypto.createDecipher(algorithm, password)
- crypto.createDecipheriv(algorithm, key, iv)
- crypto.createDiffieHellman(prime[, prime_encoding][, generator][, generator_encoding])
- crypto.createDiffieHellman(prime_length[, generator])
- crypto.createECDH(curve_name)
- crypto.createHash(algorithm)
- crypto.createHmac(algorithm, key)
- crypto.createSign(algorithm)
- crypto.createVerify(algorithm)
- crypto.getCiphers()
- crypto.getCurves()
- crypto.getDiffieHellman(group_name)
- crypto.getHashes()
- crypto.pbkdf2(password, salt, iterations, keylen, digest, callback)
- crypto.pbkdf2Sync(password, salt, iterations, keylen, digest)
- crypto.privateDecrypt(private_key, buffer)
- crypto.timingSafeEqual(a, b)
- crypto.privateEncrypt(private_key, buffer)
- crypto.publicDecrypt(public_key, buffer)
- crypto.publicEncrypt(public_key, buffer)
- crypto.randomBytes(size[, callback])
- crypto.setEngine(engine[, flags])
- Notes
- Crypto Constants
- Debugger
- UDP / Datagram Sockets
- Class: dgram.Socket
- Event: 'close'
- Event: 'error'
- Event: 'listening'
- Event: 'message'
- socket.addMembership(multicastAddress[, multicastInterface])
- socket.address()
- socket.bind([port][, address][, callback])
- socket.bind(options[, callback])
- socket.close([callback])
- socket.dropMembership(multicastAddress[, multicastInterface])
- socket.send(msg, [offset, length,] port, address[, callback])
- socket.setBroadcast(flag)
- socket.setMulticastLoopback(flag)
- socket.setMulticastTTL(ttl)
- socket.setTTL(ttl)
- socket.ref()
- socket.unref()
- Change to asynchronous
socket.bind()behavior
dgrammodule functions
- Class: dgram.Socket
- DNS
- dns.getServers()
- dns.lookup(hostname[, options], callback)
- dns.lookupService(address, port, callback)
- dns.resolve(hostname[, rrtype], callback)
- dns.resolve4(hostname, callback)
- dns.resolve6(hostname, callback)
- dns.resolveCname(hostname, callback)
- dns.resolveMx(hostname, callback)
- dns.resolveNaptr(hostname, callback)
- dns.resolveNs(hostname, callback)
- dns.resolveSoa(hostname, callback)
- dns.resolveSrv(hostname, callback)
- dns.resolvePtr(hostname, callback)
- dns.resolveTxt(hostname, callback)
- dns.reverse(ip, callback)
- dns.setServers(servers)
- Error codes
- Implementation considerations
- Domain
- Errors
- Events
- Passing arguments and
thisto listeners - Asynchronous vs. Synchronous
- Handling events only once
- Error events
- Class: EventEmitter
- Event: 'newListener'
- Event: 'removeListener'
- EventEmitter.listenerCount(emitter, eventName)
- EventEmitter.defaultMaxListeners
- emitter.addListener(eventName, listener)
- emitter.emit(eventName[, ...args])
- emitter.eventNames()
- emitter.getMaxListeners()
- emitter.listenerCount(eventName)
- emitter.listeners(eventName)
- emitter.on(eventName, listener)
- emitter.once(eventName, listener)
- emitter.prependListener(eventName, listener)
- emitter.prependOnceListener(eventName, listener)
- emitter.removeAllListeners([eventName])
- emitter.removeListener(eventName, listener)
- emitter.setMaxListeners(n)
- Passing arguments and
- File System
- Buffer API
- Class: fs.FSWatcher
- Class: fs.ReadStream
- Class: fs.Stats
- Class: fs.WriteStream
- fs.access(path[, mode], callback)
- fs.accessSync(path[, mode])
- fs.appendFile(file, data[, options], callback)
- fs.appendFileSync(file, data[, options])
- fs.chmod(path, mode, callback)
- fs.chmodSync(path, mode)
- fs.chown(path, uid, gid, callback)
- fs.chownSync(path, uid, gid)
- fs.close(fd, callback)
- fs.closeSync(fd)
- fs.constants
- fs.createReadStream(path[, options])
- fs.createWriteStream(path[, options])
- fs.exists(path, callback)
- fs.existsSync(path)
- fs.fchmod(fd, mode, callback)
- fs.fchmodSync(fd, mode)
- fs.fchown(fd, uid, gid, callback)
- fs.fchownSync(fd, uid, gid)
- fs.fdatasync(fd, callback)
- fs.fdatasyncSync(fd)
- fs.fstat(fd, callback)
- fs.fstatSync(fd)
- fs.fsync(fd, callback)
- fs.fsyncSync(fd)
- fs.ftruncate(fd, len, callback)
- fs.ftruncateSync(fd, len)
- fs.futimes(fd, atime, mtime, callback)
- fs.futimesSync(fd, atime, mtime)
- fs.lchmod(path, mode, callback)
- fs.lchmodSync(path, mode)
- fs.lchown(path, uid, gid, callback)
- fs.lchownSync(path, uid, gid)
- fs.link(existingPath, newPath, callback)
- fs.linkSync(existingPath, newPath)
- fs.lstat(path, callback)
- fs.lstatSync(path)
- fs.mkdir(path[, mode], callback)
- fs.mkdirSync(path[, mode])
- fs.mkdtemp(prefix[, options], callback)
- fs.mkdtempSync(prefix[, options])
- fs.open(path, flags[, mode], callback)
- fs.openSync(path, flags[, mode])
- fs.read(fd, buffer, offset, length, position, callback)
- fs.readdir(path[, options], callback)
- fs.readdirSync(path[, options])
- fs.readFile(file[, options], callback)
- fs.readFileSync(file[, options])
- fs.readlink(path[, options], callback)
- fs.readlinkSync(path[, options])
- fs.readSync(fd, buffer, offset, length, position)
- fs.realpath(path[, options], callback)
- fs.realpathSync(path[, options])
- fs.rename(oldPath, newPath, callback)
- fs.renameSync(oldPath, newPath)
- fs.rmdir(path, callback)
- fs.rmdirSync(path)
- fs.stat(path, callback)
- fs.statSync(path)
- fs.symlink(target, path[, type], callback)
- fs.symlinkSync(target, path[, type])
- fs.truncate(path, len, callback)
- fs.truncateSync(path, len)
- fs.unlink(path, callback)
- fs.unlinkSync(path)
- fs.unwatchFile(filename[, listener])
- fs.utimes(path, atime, mtime, callback)
- fs.utimesSync(path, atime, mtime)
- fs.watch(filename[, options][, listener])
- fs.watchFile(filename[, options], listener)
- fs.write(fd, buffer, offset, length[, position], callback)
- fs.write(fd, data[, position[, encoding]], callback)
- fs.writeFile(file, data[, options], callback)
- fs.writeFileSync(file, data[, options])
- fs.writeSync(fd, buffer, offset, length[, position])
- fs.writeSync(fd, data[, position[, encoding]])
- FS Constants
- Global Objects
- HTTP
- Class: http.Agent
- Class: http.ClientRequest
- Event: 'abort'
- Event: 'aborted'
- Event: 'connect'
- Event: 'continue'
- Event: 'response'
- Event: 'socket'
- Event: 'upgrade'
- request.abort()
- request.end([data][, encoding][, callback])
- request.flushHeaders()
- request.setNoDelay([noDelay])
- request.setSocketKeepAlive([enable][, initialDelay])
- request.setTimeout(timeout[, callback])
- request.write(chunk[, encoding][, callback])
- Class: http.Server
- Event: 'checkContinue'
- Event: 'checkExpectation'
- Event: 'clientError'
- Event: 'close'
- Event: 'connect'
- Event: 'connection'
- Event: 'request'
- Event: 'upgrade'
- server.close([callback])
- server.listen(handle[, callback])
- server.listen(path[, callback])
- server.listen([port][, hostname][, backlog][, callback])
- server.listening
- server.maxHeadersCount
- server.setTimeout(msecs, callback)
- server.timeout
- Class: http.ServerResponse
- Event: 'close'
- Event: 'finish'
- response.addTrailers(headers)
- response.end([data][, encoding][, callback])
- response.finished
- response.getHeader(name)
- response.headersSent
- response.removeHeader(name)
- response.sendDate
- response.setHeader(name, value)
- response.setTimeout(msecs, callback)
- response.statusCode
- response.statusMessage
- response.write(chunk[, encoding][, callback])
- response.writeContinue()
- response.writeHead(statusCode[, statusMessage][, headers])
- Class: http.IncomingMessage
- http.METHODS
- http.STATUS_CODES
- http.createClient([port][, host])
- http.createServer([requestListener])
- http.get(options[, callback])
- http.globalAgent
- http.request(options[, callback])
- HTTPS
- Modules
- net
- Class: net.Server
- Event: 'close'
- Event: 'connection'
- Event: 'error'
- Event: 'listening'
- server.address()
- server.close([callback])
- server.connections
- server.getConnections(callback)
- server.listen(handle[, backlog][, callback])
- server.listen(options[, callback])
- server.listen(path[, backlog][, callback])
- server.listen([port][, hostname][, backlog][, callback])
- server.listening
- server.maxConnections
- server.ref()
- server.unref()
- Class: net.Socket
- new net.Socket([options])
- Event: 'close'
- Event: 'connect'
- Event: 'data'
- Event: 'drain'
- Event: 'end'
- Event: 'error'
- Event: 'lookup'
- Event: 'timeout'
- socket.address()
- socket.bufferSize
- socket.bytesRead
- socket.bytesWritten
- socket.connect(options[, connectListener])
- socket.connect(path[, connectListener])
- socket.connect(port[, host][, connectListener])
- socket.connecting
- socket.destroy([exception])
- socket.destroyed
- socket.end([data][, encoding])
- socket.localAddress
- socket.localPort
- socket.pause()
- socket.ref()
- socket.remoteAddress
- socket.remoteFamily
- socket.remotePort
- socket.resume()
- socket.setEncoding([encoding])
- socket.setKeepAlive([enable][, initialDelay])
- socket.setNoDelay([noDelay])
- socket.setTimeout(timeout[, callback])
- socket.unref()
- socket.write(data[, encoding][, callback])
- net.connect(options[, connectListener])
- net.connect(path[, connectListener])
- net.connect(port[, host][, connectListener])
- net.createConnection(options[, connectListener])
- net.createConnection(path[, connectListener])
- net.createConnection(port[, host][, connectListener])
- net.createServer([options][, connectionListener])
- net.isIP(input)
- net.isIPv4(input)
- net.isIPv6(input)
- Class: net.Server
- OS
- Path
- process
- Process Events
- process.abort()
- process.arch
- process.argv
- process.argv0
- process.chdir(directory)
- process.config
- process.connected
- process.cpuUsage([previousValue])
- process.cwd()
- process.disconnect()
- process.env
- process.emitWarning(warning[, name][, ctor])
- process.execArgv
- process.execPath
- process.exit([code])
- process.exitCode
- process.getegid()
- process.geteuid()
- process.getgid()
- process.getgroups()
- process.getuid()
- process.hrtime([time])
- process.initgroups(user, extra_group)
- process.kill(pid[, signal])
- process.mainModule
- process.memoryUsage()
- process.nextTick(callback[, ...args])
- process.pid
- process.platform
- process.release
- process.send(message[, sendHandle[, options]][, callback])
- process.setegid(id)
- process.seteuid(id)
- process.setgid(id)
- process.setgroups(groups)
- process.setuid(id)
- process.stderr
- process.stdin
- process.stdout
- process.title
- process.umask([mask])
- process.uptime()
- process.version
- process.versions
- Exit Codes
- punycode
- Query String
- Readline
- REPL
- Stream
- Organization of this Document
- Types of Streams
- API for Stream Consumers
- API for Stream Implementers
- Additional Notes
- StringDecoder
- Timers
- TLS (SSL)
- TLS/SSL Concepts
- Modifying the Default TLS Cipher suite
- Class: tls.Server
- Event: 'tlsClientError'
- Event: 'newSession'
- Event: 'OCSPRequest'
- Event: 'resumeSession'
- Event: 'secureConnection'
- server.addContext(hostname, context)
- server.address()
- server.close([callback])
- server.connections
- server.getTicketKeys()
- server.listen(port[, hostname][, callback])
- server.setTicketKeys(keys)
- Class: tls.TLSSocket
- new tls.TLSSocket(socket[, options])
- Event: 'OCSPResponse'
- Event: 'secureConnect'
- tlsSocket.address()
- tlsSocket.authorized
- tlsSocket.authorizationError
- tlsSocket.encrypted
- tlsSocket.getCipher()
- tlsSocket.getEphemeralKeyInfo()
- tlsSocket.getPeerCertificate([ detailed ])
- tlsSocket.getProtocol()
- tlsSocket.getSession()
- tlsSocket.getTLSTicket()
- tlsSocket.localAddress
- tlsSocket.localPort
- tlsSocket.remoteAddress
- tlsSocket.remoteFamily
- tlsSocket.remotePort
- tlsSocket.renegotiate(options, callback)
- tlsSocket.setMaxSendFragment(size)
- tls.connect(port[, host][, options][, callback])
- tls.connect(path[, options][, callback])
- tls.connect(options[, callback])
- tls.createSecureContext(options)
- tls.createServer([options][, secureConnectionListener])
- tls.getCiphers()
- Deprecated APIs
- TTY
- URL
- util
- util.debuglog(section)
- util.deprecate(function, string)
- util.format(format[, ...args])
- util.inherits(constructor, superConstructor)
- util.inspect(object[, options])
- Deprecated APIs
- util.debug(string)
- util.error([...strings])
- util.isArray(object)
- util.isBoolean(object)
- util.isBuffer(object)
- util.isDate(object)
- util.isError(object)
- util.isFunction(object)
- util.isNull(object)
- util.isNullOrUndefined(object)
- util.isNumber(object)
- util.isObject(object)
- util.isPrimitive(object)
- util.isRegExp(object)
- util.isString(object)
- util.isSymbol(object)
- util.isUndefined(object)
- util.log(string)
- util.print([...strings])
- util.puts([...strings])
- util._extend(target, source)
- V8
- Executing JavaScript
- Class: vm.Script
- vm.createContext([sandbox])
- vm.isContext(sandbox)
- vm.runInContext(code, contextifiedSandbox[, options])
- vm.runInDebugContext(code)
- vm.runInNewContext(code[, sandbox][, options])
- vm.runInThisContext(code[, options])
- Example: Running an HTTP Server within a VM
- What does it mean to "contextify" an object?
- Zlib
- Compressing HTTP requests and responses
- Memory Usage Tuning
- Flushing
- Constants
- Class Options
- Class: zlib.Deflate
- Class: zlib.DeflateRaw
- Class: zlib.Gunzip
- Class: zlib.Gzip
- Class: zlib.Inflate
- Class: zlib.InflateRaw
- Class: zlib.Unzip
- Class: zlib.Zlib
- zlib.constants
- zlib.createDeflate([options])
- zlib.createDeflateRaw([options])
- zlib.createGunzip([options])
- zlib.createGzip([options])
- zlib.createInflate([options])
- zlib.createInflateRaw([options])
- zlib.createUnzip([options])
- Convenience Methods
- zlib.deflate(buf[, options], callback)
- zlib.deflateSync(buf[, options])
- zlib.deflateRaw(buf[, options], callback)
- zlib.deflateRawSync(buf[, options])
- zlib.gunzip(buf[, options], callback)
- zlib.gunzipSync(buf[, options])
- zlib.gzip(buf[, options], callback)
- zlib.gzipSync(buf[, options])
- zlib.inflate(buf[, options], callback)
- zlib.inflateSync(buf[, options])
- zlib.inflateRaw(buf[, options], callback)
- zlib.inflateRawSync(buf[, options])
- zlib.unzip(buf[, options], callback)
- zlib.unzipSync(buf[, options])
About this Documentation#
The goal of this documentation is to comprehensively explain the Node.js API, both from a reference as well as a conceptual point of view. Each section describes a built-in module or high-level concept.
Where appropriate, property types, method arguments, and the arguments provided to event handlers are detailed in a list underneath the topic heading.
Every .html document has a corresponding .json document presenting
the same information in a structured manner. This feature is
experimental, and added for the benefit of IDEs and other utilities that
wish to do programmatic things with the documentation.
Every .html and .json file is generated based on the corresponding
.md file in the doc/api/ folder in Node.js's source tree. The
documentation is generated using the tools/doc/generate.js program.
The HTML template is located at doc/template.html.
If you find an error in this documentation, please submit an issue or see the contributing guide for directions on how to submit a patch.
Stability Index#
Throughout the documentation, you will see indications of a section's stability. The Node.js API is still somewhat changing, and as it matures, certain parts are more reliable than others. Some are so proven, and so relied upon, that they are unlikely to ever change at all. Others are brand new and experimental, or known to be hazardous and in the process of being redesigned.
The stability indices are as follows:
Stability: 0 - Deprecated This feature is known to be problematic, and changes are planned. Do not rely on it. Use of the feature may cause warnings. Backwards compatibility should not be expected.
Stability: 1 - Experimental This feature is subject to change, and is gated by a command line flag. It may change or be removed in future versions.
Stability: 2 - Stable The API has proven satisfactory. Compatibility with the npm ecosystem is a high priority, and will not be broken unless absolutely necessary.
Stability: 3 - Locked Only fixes related to security, performance, or bug fixes will be accepted. Please do not suggest API changes in this area; they will be refused.
JSON Output#
Stability: 1 - Experimental
Every HTML file in the markdown has a corresponding JSON file with the same data.
This feature was added in Node.js v0.6.12. It is experimental.
Syscalls and man pages#
System calls like open(2) and read(2) define the interface between user programs
and the underlying operating system. Node functions which simply wrap a syscall,
like fs.open(), will document that. The docs link to the corresponding man
pages (short for manual pages) which describe how the syscalls work.
Caveat: some syscalls, like lchown(2), are BSD-specific. That means, for
example, that fs.lchown() only works on Mac OS X and other BSD-derived systems,
and is not available on Linux.
Most Unix syscalls have Windows equivalents, but behavior may differ on Windows relative to Linux and OS X. For an example of the subtle ways in which it's sometimes impossible to replace Unix syscall semantics on Windows, see Node issue 4760.
Usage#
node [options] [v8 options] [script.js | -e "script"] [arguments]
Please see the Command Line Options document for information about different options and ways to run scripts with Node.js.
Example#
An example of a web server written with Node.js which responds with
'Hello World':
const http = require('http');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
To run the server, put the code into a file called example.js and execute
it with Node.js:
$ node example.js
Server running at http://127.0.0.1:3000/
All of the examples in the documentation can be run similarly.
Addons#
Node.js Addons are dynamically-linked shared objects, written in C or C++, that
can be loaded into Node.js using the require() function, and used
just as if they were an ordinary Node.js module. They are used primarily to
provide an interface between JavaScript running in Node.js and C/C++ libraries.
At the moment, the method for implementing Addons is rather complicated, involving knowledge of several components and APIs :
V8: the C++ library Node.js currently uses to provide the JavaScript implementation. V8 provides the mechanisms for creating objects, calling functions, etc. V8's API is documented mostly in the
v8.hheader file (deps/v8/include/v8.hin the Node.js source tree), which is also available online.libuv: The C library that implements the Node.js event loop, its worker threads and all of the asynchronous behaviors of the platform. It also serves as a cross-platform abstraction library, giving easy, POSIX-like access across all major operating systems to many common system tasks, such as interacting with the filesystem, sockets, timers and system events. libuv also provides a pthreads-like threading abstraction that may be used to power more sophisticated asynchronous Addons that need to move beyond the standard event loop. Addon authors are encouraged to think about how to avoid blocking the event loop with I/O or other time-intensive tasks by off-loading work via libuv to non-blocking system operations, worker threads or a custom use of libuv's threads.
Internal Node.js libraries. Node.js itself exports a number of C/C++ APIs that Addons can use — the most important of which is the
node::ObjectWrapclass.Node.js includes a number of other statically linked libraries including OpenSSL. These other libraries are located in the
deps/directory in the Node.js source tree. Only the V8 and OpenSSL symbols are purposefully re-exported by Node.js and may be used to various extents by Addons. See Linking to Node.js' own dependencies for additional information.
All of the following examples are available for download and may be used as a starting-point for your own Addon.
Hello world#
This "Hello world" example is a simple Addon, written in C++, that is the equivalent of the following JavaScript code:
module.exports.hello = () => 'world';
First, create the file hello.cc:
// hello.cc
#include <node.h>
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void Method(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(isolate, "world"));
}
void init(Local<Object> exports) {
NODE_SET_METHOD(exports, "hello", Method);
}
NODE_MODULE(addon, init)
} // namespace demo
Note that all Node.js Addons must export an initialization function following the pattern:
void Initialize(Local<Object> exports);
NODE_MODULE(module_name, Initialize)
There is no semi-colon after NODE_MODULE as it's not a function (see
node.h).
The module_name must match the filename of the final binary (excluding
the .node suffix).
In the hello.cc example, then, the initialization function is init and the
Addon module name is addon.
Building#
Once the source code has been written, it must be compiled into the binary
addon.node file. To do so, create a file called binding.gyp in the
top-level of the project describing the build configuration of your module
using a JSON-like format. This file is used by node-gyp -- a tool written
specifically to compile Node.js Addons.
{
"targets": [
{
"target_name": "addon",
"sources": [ "hello.cc" ]
}
]
}
Note: A version of the node-gyp utility is bundled and distributed with
Node.js as part of npm. This version is not made directly available for
developers to use and is intended only to support the ability to use the
npm install command to compile and install Addons. Developers who wish to
use node-gyp directly can install it using the command
npm install -g node-gyp. See the node-gyp installation instructions for
more information, including platform-specific requirements.
Once the binding.gyp file has been created, use node-gyp configure to
generate the appropriate project build files for the current platform. This
will generate either a Makefile (on Unix platforms) or a vcxproj file
(on Windows) in the build/ directory.
Next, invoke the node-gyp build command to generate the compiled addon.node
file. This will be put into the build/Release/ directory.
When using npm install to install a Node.js Addon, npm uses its own bundled
version of node-gyp to perform this same set of actions, generating a
compiled version of the Addon for the user's platform on demand.
Once built, the binary Addon can be used from within Node.js by pointing
require() to the built addon.node module:
// hello.js
const addon = require('./build/Release/addon');
console.log(addon.hello());
// Prints: 'world'
Please see the examples below for further information or https://github.com/arturadib/node-qt for an example in production.
Because the exact path to the compiled Addon binary can vary depending on how
it is compiled (i.e. sometimes it may be in ./build/Debug/), Addons can use
the bindings package to load the compiled module.
Note that while the bindings package implementation is more sophisticated
in how it locates Addon modules, it is essentially using a try-catch pattern
similar to:
try {
return require('./build/Release/addon.node');
} catch (err) {
return require('./build/Debug/addon.node');
}
Linking to Node.js' own dependencies#
Node.js uses a number of statically linked libraries such as V8, libuv and
OpenSSL. All Addons are required to link to V8 and may link to any of the
other dependencies as well. Typically, this is as simple as including
the appropriate #include <...> statements (e.g. #include <v8.h>) and
node-gyp will locate the appropriate headers automatically. However, there
are a few caveats to be aware of:
When
node-gypruns, it will detect the specific release version of Node.js and download either the full source tarball or just the headers. If the full source is downloaded, Addons will have complete access to the full set of Node.js dependencies. However, if only the Node.js headers are downloaded, then only the symbols exported by Node.js will be available.node-gypcan be run using the--nodedirflag pointing at a local Node.js source image. Using this option, the Addon will have access to the full set of dependencies.
Loading Addons using require()#
The filename extension of the compiled Addon binary is .node (as opposed
to .dll or .so). The require() function is written to look for
files with the .node file extension and initialize those as dynamically-linked
libraries.
When calling require(), the .node extension can usually be
omitted and Node.js will still find and initialize the Addon. One caveat,
however, is that Node.js will first attempt to locate and load modules or
JavaScript files that happen to share the same base name. For instance, if
there is a file addon.js in the same directory as the binary addon.node,
then require('addon') will give precedence to the addon.js file
and load it instead.
Native Abstractions for Node.js#
Each of the examples illustrated in this document make direct use of the Node.js and V8 APIs for implementing Addons. It is important to understand that the V8 API can, and has, changed dramatically from one V8 release to the next (and one major Node.js release to the next). With each change, Addons may need to be updated and recompiled in order to continue functioning. The Node.js release schedule is designed to minimize the frequency and impact of such changes but there is little that Node.js can do currently to ensure stability of the V8 APIs.
The Native Abstractions for Node.js (or nan) provide a set of tools that
Addon developers are recommended to use to keep compatibility between past and
future releases of V8 and Node.js. See the nan examples for an
illustration of how it can be used.
Addon examples#
Following are some example Addons intended to help developers get started. The examples make use of the V8 APIs. Refer to the online V8 reference for help with the various V8 calls, and V8's Embedder's Guide for an explanation of several concepts used such as handles, scopes, function templates, etc.
Each of these examples using the following binding.gyp file:
{
"targets": [
{
"target_name": "addon",
"sources": [ "addon.cc" ]
}
]
}
In cases where there is more than one .cc file, simply add the additional
filename to the sources array. For example:
"sources": ["addon.cc", "myexample.cc"]
Once the binding.gyp file is ready, the example Addons can be configured and
built using node-gyp:
$ node-gyp configure build
Function arguments#
Addons will typically expose objects and functions that can be accessed from JavaScript running within Node.js. When functions are invoked from JavaScript, the input arguments and return value must be mapped to and from the C/C++ code.
The following example illustrates how to read function arguments passed from JavaScript and how to return a result:
// addon.cc
#include <node.h>
namespace demo {
using v8::Exception;
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;
// This is the implementation of the "add" method
// Input arguments are passed using the
// const FunctionCallbackInfo<Value>& args struct
void Add(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
// Check the number of arguments passed.
if (args.Length() < 2) {
// Throw an Error that is passed back to JavaScript
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong number of arguments")));
return;
}
// Check the argument types
if (!args[0]->IsNumber() || !args[1]->IsNumber()) {
isolate->ThrowException(Exception::TypeError(
String::NewFromUtf8(isolate, "Wrong arguments")));
return;
}
// Perform the operation
double value = args[0]->NumberValue() + args[1]->NumberValue();
Local<Number> num = Number::New(isolate, value);
// Set the return value (using the passed in
// FunctionCallbackInfo<Value>&)
args.GetReturnValue().Set(num);
}
void Init(Local<Object> exports) {
NODE_SET_METHOD(exports, "add", Add);
}
NODE_MODULE(addon, Init)
} // namespace demo
Once compiled, the example Addon can be required and used from within Node.js:
// test.js
const addon = require('./build/Release/addon');
console.log('This should be eight:', addon.add(3, 5));
Callbacks#
It is common practice within Addons to pass JavaScript functions to a C++ function and execute them from there. The following example illustrates how to invoke such callbacks:
// addon.cc
#include <node.h>
namespace demo {
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Null;
using v8::Object;
using v8::String;
using v8::Value;
void RunCallback(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Function> cb = Local<Function>::Cast(args[0]);
const unsigned argc = 1;
Local<Value> argv[argc] = { String::NewFromUtf8(isolate, "hello world") };
cb->Call(Null(isolate), argc, argv);
}
void Init(Local<Object> exports, Local<Object> module) {
NODE_SET_METHOD(module, "exports", RunCallback);
}
NODE_MODULE(addon, Init)
} // namespace demo
Note that this example uses a two-argument form of Init() that receives
the full module object as the second argument. This allows the Addon
to completely overwrite exports with a single function instead of
adding the function as a property of exports.
To test it, run the following JavaScript:
// test.js
const addon = require('./build/Release/addon');
addon((msg) => {
console.log(msg);
// Prints: 'hello world'
});
Note that, in this example, the callback function is invoked synchronously.
Object factory#
Addons can create and return new objects from within a C++ function as
illustrated in the following example. An object is created and returned with a
property msg that echoes the string passed to createObject():
// addon.cc
#include <node.h>
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void CreateObject(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<Object> obj = Object::New(isolate);
obj->Set(String::NewFromUtf8(isolate, "msg"), args[0]->ToString());
args.GetReturnValue().Set(obj);
}
void Init(Local<Object> exports, Local<Object> module) {
NODE_SET_METHOD(module, "exports", CreateObject);
}
NODE_MODULE(addon, Init)
} // namespace demo
To test it in JavaScript:
// test.js
const addon = require('./build/Release/addon');
const obj1 = addon('hello');
const obj2 = addon('world');
console.log(obj1.msg, obj2.msg);
// Prints: 'hello world'
Function factory#
Another common scenario is creating JavaScript functions that wrap C++ functions and returning those back to JavaScript:
// addon.cc
#include <node.h>
namespace demo {
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void MyFunction(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
args.GetReturnValue().Set(String::NewFromUtf8(isolate, "hello world"));
}
void CreateFunction(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, MyFunction);
Local<Function> fn = tpl->GetFunction();
// omit this to make it anonymous
fn->SetName(String::NewFromUtf8(isolate, "theFunction"));
args.GetReturnValue().Set(fn);
}
void Init(Local<Object> exports, Local<Object> module) {
NODE_SET_METHOD(module, "exports", CreateFunction);
}
NODE_MODULE(addon, Init)
} // namespace demo
To test:
// test.js
const addon = require('./build/Release/addon');
const fn = addon();
console.log(fn());
// Prints: 'hello world'
Wrapping C++ objects#
It is also possible to wrap C++ objects/classes in a way that allows new
instances to be created using the JavaScript new operator:
// addon.cc
#include <node.h>
#include "myobject.h"
namespace demo {
using v8::Local;
using v8::Object;
void InitAll(Local<Object> exports) {
MyObject::Init(exports);
}
NODE_MODULE(addon, InitAll)
} // namespace demo
Then, in myobject.h, the wrapper class inherits from node::ObjectWrap:
// myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <node.h>
#include <node_object_wrap.h>
namespace demo {
class MyObject : public node::ObjectWrap {
public:
static void Init(v8::Local<v8::Object> exports);
private:
explicit MyObject(double value = 0);
~MyObject();
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Persistent<v8::Function> constructor;
double value_;
};
} // namespace demo
#endif
In myobject.cc, implement the various methods that are to be exposed.
Below, the method plusOne() is exposed by adding it to the constructor's
prototype:
// myobject.cc
#include "myobject.h"
namespace demo {
using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::Persistent;
using v8::String;
using v8::Value;
Persistent<Function> MyObject::constructor;
MyObject::MyObject(double value) : value_(value) {
}
MyObject::~MyObject() {
}
void MyObject::Init(Local<Object> exports) {
Isolate* isolate = exports->GetIsolate();
// Prepare constructor template
Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);
tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype
NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);
constructor.Reset(isolate, tpl->GetFunction());
exports->Set(String::NewFromUtf8(isolate, "MyObject"),
tpl->GetFunction());
}
void MyObject::New(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
if (args.IsConstructCall()) {
// Invoked as constructor: `new MyObject(...)`
double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
MyObject* obj = new MyObject(value);
obj->Wrap(args.This());
args.GetReturnValue().Set(args.This());
} else {
// Invoked as plain function `MyObject(...)`, turn into construct call.
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
Local<Context> context = isolate->GetCurrentContext();
Local<Function> cons = Local<Function>::New(isolate, constructor);
Local<Object> result =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(result);
}
}
void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder());
obj->value_ += 1;
args.GetReturnValue().Set(Number::New(isolate, obj->value_));
}
} // namespace demo
To build this example, the myobject.cc file must be added to the
binding.gyp:
{
"targets": [
{
"target_name": "addon",
"sources": [
"addon.cc",
"myobject.cc"
]
}
]
}
Test it with:
// test.js
const addon = require('./build/Release/addon');
const obj = new addon.MyObject(10);
console.log(obj.plusOne());
// Prints: 11
console.log(obj.plusOne());
// Prints: 12
console.log(obj.plusOne());
// Prints: 13
Factory of wrapped objects#
Alternatively, it is possible to use a factory pattern to avoid explicitly
creating object instances using the JavaScript new operator:
const obj = addon.createObject();
// instead of:
// const obj = new addon.Object();
First, the createObject() method is implemented in addon.cc:
// addon.cc
#include <node.h>
#include "myobject.h"
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::String;
using v8::Value;
void CreateObject(const FunctionCallbackInfo<Value>& args) {
MyObject::NewInstance(args);
}
void InitAll(Local<Object> exports, Local<Object> module) {
MyObject::Init(exports->GetIsolate());
NODE_SET_METHOD(module, "exports", CreateObject);
}
NODE_MODULE(addon, InitAll)
} // namespace demo
In myobject.h, the static method NewInstance() is added to handle
instantiating the object. This method takes the place of using new in
JavaScript:
// myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <node.h>
#include <node_object_wrap.h>
namespace demo {
class MyObject : public node::ObjectWrap {
public:
static void Init(v8::Isolate* isolate);
static void NewInstance(const v8::FunctionCallbackInfo<v8::Value>& args);
private:
explicit MyObject(double value = 0);
~MyObject();
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static void PlusOne(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Persistent<v8::Function> constructor;
double value_;
};
} // namespace demo
#endif
The implementation in myobject.cc is similar to the previous example:
// myobject.cc
#include <node.h>
#include "myobject.h"
namespace demo {
using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::Persistent;
using v8::String;
using v8::Value;
Persistent<Function> MyObject::constructor;
MyObject::MyObject(double value) : value_(value) {
}
MyObject::~MyObject() {
}
void MyObject::Init(Isolate* isolate) {
// Prepare constructor template
Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);
tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype
NODE_SET_PROTOTYPE_METHOD(tpl, "plusOne", PlusOne);
constructor.Reset(isolate, tpl->GetFunction());
}
void MyObject::New(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
if (args.IsConstructCall()) {
// Invoked as constructor: `new MyObject(...)`
double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
MyObject* obj = new MyObject(value);
obj->Wrap(args.This());
args.GetReturnValue().Set(args.This());
} else {
// Invoked as plain function `MyObject(...)`, turn into construct call.
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
Local<Function> cons = Local<Function>::New(isolate, constructor);
Local<Context> context = isolate->GetCurrentContext();
Local<Object> instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
}
void MyObject::NewInstance(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
const unsigned argc = 1;
Local<Value> argv[argc] = { args[0] };
Local<Function> cons = Local<Function>::New(isolate, constructor);
Local<Context> context = isolate->GetCurrentContext();
Local<Object> instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
void MyObject::PlusOne(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
MyObject* obj = ObjectWrap::Unwrap<MyObject>(args.Holder());
obj->value_ += 1;
args.GetReturnValue().Set(Number::New(isolate, obj->value_));
}
} // namespace demo
Once again, to build this example, the myobject.cc file must be added to the
binding.gyp:
{
"targets": [
{
"target_name": "addon",
"sources": [
"addon.cc",
"myobject.cc"
]
}
]
}
Test it with:
// test.js
const createObject = require('./build/Release/addon');
const obj = createObject(10);
console.log(obj.plusOne());
// Prints: 11
console.log(obj.plusOne());
// Prints: 12
console.log(obj.plusOne());
// Prints: 13
const obj2 = createObject(20);
console.log(obj2.plusOne());
// Prints: 21
console.log(obj2.plusOne());
// Prints: 22
console.log(obj2.plusOne());
// Prints: 23
Passing wrapped objects around#
In addition to wrapping and returning C++ objects, it is possible to pass
wrapped objects around by unwrapping them with the Node.js helper function
node::ObjectWrap::Unwrap. The following examples shows a function add()
that can take two MyObject objects as input arguments:
// addon.cc
#include <node.h>
#include <node_object_wrap.h>
#include "myobject.h"
namespace demo {
using v8::FunctionCallbackInfo;
using v8::Isolate;
using v8::Local;
using v8::Number;
using v8::Object;
using v8::String;
using v8::Value;
void CreateObject(const FunctionCallbackInfo<Value>& args) {
MyObject::NewInstance(args);
}
void Add(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
MyObject* obj1 = node::ObjectWrap::Unwrap<MyObject>(
args[0]->ToObject());
MyObject* obj2 = node::ObjectWrap::Unwrap<MyObject>(
args[1]->ToObject());
double sum = obj1->value() + obj2->value();
args.GetReturnValue().Set(Number::New(isolate, sum));
}
void InitAll(Local<Object> exports) {
MyObject::Init(exports->GetIsolate());
NODE_SET_METHOD(exports, "createObject", CreateObject);
NODE_SET_METHOD(exports, "add", Add);
}
NODE_MODULE(addon, InitAll)
} // namespace demo
In myobject.h, a new public method is added to allow access to private values
after unwrapping the object.
// myobject.h
#ifndef MYOBJECT_H
#define MYOBJECT_H
#include <node.h>
#include <node_object_wrap.h>
namespace demo {
class MyObject : public node::ObjectWrap {
public:
static void Init(v8::Isolate* isolate);
static void NewInstance(const v8::FunctionCallbackInfo<v8::Value>& args);
inline double value() const { return value_; }
private:
explicit MyObject(double value = 0);
~MyObject();
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static v8::Persistent<v8::Function> constructor;
double value_;
};
} // namespace demo
#endif
The implementation of myobject.cc is similar to before:
// myobject.cc
#include <node.h>
#include "myobject.h"
namespace demo {
using v8::Context;
using v8::Function;
using v8::FunctionCallbackInfo;
using v8::FunctionTemplate;
using v8::Isolate;
using v8::Local;
using v8::Object;
using v8::Persistent;
using v8::String;
using v8::Value;
Persistent<Function> MyObject::constructor;
MyObject::MyObject(double value) : value_(value) {
}
MyObject::~MyObject() {
}
void MyObject::Init(Isolate* isolate) {
// Prepare constructor template
Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, New);
tpl->SetClassName(String::NewFromUtf8(isolate, "MyObject"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
constructor.Reset(isolate, tpl->GetFunction());
}
void MyObject::New(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
if (args.IsConstructCall()) {
// Invoked as constructor: `new MyObject(...)`
double value = args[0]->IsUndefined() ? 0 : args[0]->NumberValue();
MyObject* obj = new MyObject(value);
obj->Wrap(args.This());
args.GetReturnValue().Set(args.This());
} else {
// Invoked as plain function `MyObject(...)`, turn into construct call.
const int argc = 1;
Local<Value> argv[argc] = { args[0] };
Local<Context> context = isolate->GetCurrentContext();
Local<Function> cons = Local<Function>::New(isolate, constructor);
Local<Object> instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
}
void MyObject::NewInstance(const FunctionCallbackInfo<Value>& args) {
Isolate* isolate = args.GetIsolate();
const unsigned argc = 1;
Local<Value> argv[argc] = { args[0] };
Local<Function> cons = Local<Function>::New(isolate, constructor);
Local<Context> context = isolate->GetCurrentContext();
Local<Object> instance =
cons->NewInstance(context, argc, argv).ToLocalChecked();
args.GetReturnValue().Set(instance);
}
} // namespace demo
Test it with:
// test.js
const addon = require('./build/Release/addon');
const obj1 = addon.createObject(10);
const obj2 = addon.createObject(20);
const result = addon.add(obj1, obj2);
console.log(result);
// Prints: 30
AtExit hooks#
An "AtExit" hook is a function that is invoked after the Node.js event loop
has ended but before the JavaScript VM is terminated and Node.js shuts down.
"AtExit" hooks are registered using the node::AtExit API.
void AtExit(callback, args)#
callback:void (*)(void*)- A pointer to the function to call at exit.args:void*- A pointer to pass to the callback at exit.
Registers exit hooks that run after the event loop has ended but before the VM is killed.
AtExit takes two parameters: a pointer to a callback function to run at exit, and a pointer to untyped context data to be passed to that callback.
Callbacks are run in last-in first-out order.
The following addon.cc implements AtExit:
// addon.cc
#undef NDEBUG
#include <assert.h>
#include <stdlib.h>
#include <node.h>
namespace demo {
using node::AtExit;
using v8::HandleScope;
using v8::Isolate;
using v8::Local;
using v8::Object;
static char cookie[] = "yum yum";
static int at_exit_cb1_called = 0;
static int at_exit_cb2_called = 0;
static void at_exit_cb1(void* arg) {
Isolate* isolate = static_cast<Isolate*>(arg);
HandleScope scope(isolate);
Local<Object> obj = Object::New(isolate);
assert(!obj.IsEmpty()); // assert VM is still alive
assert(obj->IsObject());
at_exit_cb1_called++;
}
static void at_exit_cb2(void* arg) {
assert(arg == static_cast<void*>(cookie));
at_exit_cb2_called++;
}
static void sanity_check(void*) {
assert(at_exit_cb1_called == 1);
assert(at_exit_cb2_called == 2);
}
void init(Local<Object> exports) {
AtExit(sanity_check);
AtExit(at_exit_cb2, cookie);
AtExit(at_exit_cb2, cookie);
AtExit(at_exit_cb1, exports->GetIsolate());
}
NODE_MODULE(addon, init);
} // namespace demo
Test in JavaScript by running:
// test.js
const addon = require('./build/Release/addon');
Assert#
Stability: 3 - Locked
The assert module provides a simple set of assertion tests that can be used to
test invariants. The module is intended for internal use by Node.js, but can be
used in application code via require('assert'). However, assert is not a
testing framework, and is not intended to be used as a general purpose assertion
library.
The API for the assert module is Locked. This means that there will be no
additions or changes to any of the methods implemented and exposed by
the module.
assert(value[, message])#
An alias of assert.ok() .
const assert = require('assert');
assert(true);
// OK
assert(1);
// OK
assert(false);
// throws "AssertionError: false == true"
assert(0);
// throws "AssertionError: 0 == true"
assert(false, 'it\'s false');
// throws "AssertionError: it's false"
assert.deepEqual(actual, expected[, message])#
Tests for deep equality between the actual and expected parameters.
Primitive values are compared with the equal comparison operator ( == ).
Only enumerable "own" properties are considered. The deepEqual()
implementation does not test object prototypes, attached symbols, or
non-enumerable properties. This can lead to some potentially surprising
results. For example, the following example does not throw an AssertionError
because the properties on the Error object are non-enumerable:
// WARNING: This does not throw an AssertionError!
assert.deepEqual(Error('a'), Error('b'));
"Deep" equality means that the enumerable "own" properties of child objects are evaluated also:
const assert = require('assert');
const obj1 = {
a : {
b : 1
}
};
const obj2 = {
a : {
b : 2
}
};
const obj3 = {
a : {
b : 1
}
};
const obj4 = Object.create(obj1);
assert.deepEqual(obj1, obj1);
// OK, object is equal to itself
assert.deepEqual(obj1, obj2);
// AssertionError: { a: { b: 1 } } deepEqual { a: { b: 2 } }
// values of b are different
assert.deepEqual(obj1, obj3);
// OK, objects are equal
assert.deepEqual(obj1, obj4);
// AssertionError: { a: { b: 1 } } deepEqual {}
// Prototypes are ignored
If the values are not equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
assert.deepStrictEqual(actual, expected[, message])#
Generally identical to assert.deepEqual() with two exceptions. First,
primitive values are compared using the strict equality operator ( === ).
Second, object comparisons include a strict equality check of their prototypes.
const assert = require('assert');
assert.deepEqual({a:1}, {a:'1'});
// OK, because 1 == '1'
assert.deepStrictEqual({a:1}, {a:'1'});
// AssertionError: { a: 1 } deepStrictEqual { a: '1' }
// because 1 !== '1' using strict equality
If the values are not equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
assert.doesNotThrow(block[, error][, message])#
Asserts that the function block does not throw an error. See
assert.throws() for more details.
When assert.doesNotThrow() is called, it will immediately call the block
function.
If an error is thrown and it is the same type as that specified by the error
parameter, then an AssertionError is thrown. If the error is of a different
type, or if the error parameter is undefined, the error is propagated back
to the caller.
The following, for instance, will throw the TypeError because there is no
matching error type in the assertion:
assert.doesNotThrow(
() => {
throw new TypeError('Wrong value');
},
SyntaxError
);
However, the following will result in an AssertionError with the message
'Got unwanted exception (TypeError)..':
assert.doesNotThrow(
() => {
throw new TypeError('Wrong value');
},
TypeError
);
If an AssertionError is thrown and a value is provided for the message
parameter, the value of message will be appended to the AssertionError
message:
assert.doesNotThrow(
() => {
throw new TypeError('Wrong value');
},
TypeError,
'Whoops'
);
// Throws: AssertionError: Got unwanted exception (TypeError). Whoops
assert.equal(actual, expected[, message])#
Tests shallow, coercive equality between the actual and expected parameters
using the equal comparison operator ( == ).
const assert = require('assert');
assert.equal(1, 1);
// OK, 1 == 1
assert.equal(1, '1');
// OK, 1 == '1'
assert.equal(1, 2);
// AssertionError: 1 == 2
assert.equal({a: {b: 1}}, {a: {b: 1}});
//AssertionError: { a: { b: 1 } } == { a: { b: 1 } }
If the values are not equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
assert.fail(actual, expected, message, operator)#
Throws an AssertionError. If message is falsy, the error message is set as
the values of actual and expected separated by the provided operator.
Otherwise, the error message is the value of message.
const assert = require('assert');
assert.fail(1, 2, undefined, '>');
// AssertionError: 1 > 2
assert.fail(1, 2, 'whoops', '>');
// AssertionError: whoops
assert.ifError(value)#
Throws value if value is truthy. This is useful when testing the error
argument in callbacks.
const assert = require('assert');
assert.ifError(0);
// OK
assert.ifError(1);
// Throws 1
assert.ifError('error');
// Throws 'error'
assert.ifError(new Error());
// Throws Error
assert.notDeepEqual(actual, expected[, message])#
Tests for any deep inequality. Opposite of assert.deepEqual().
const assert = require('assert');
const obj1 = {
a : {
b : 1
}
};
const obj2 = {
a : {
b : 2
}
};
const obj3 = {
a : {
b : 1
}
};
const obj4 = Object.create(obj1);
assert.notDeepEqual(obj1, obj1);
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
assert.notDeepEqual(obj1, obj2);
// OK, obj1 and obj2 are not deeply equal
assert.notDeepEqual(obj1, obj3);
// AssertionError: { a: { b: 1 } } notDeepEqual { a: { b: 1 } }
assert.notDeepEqual(obj1, obj4);
// OK, obj1 and obj2 are not deeply equal
If the values are deeply equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
assert.notDeepStrictEqual(actual, expected[, message])#
Tests for deep strict inequality. Opposite of assert.deepStrictEqual().
const assert = require('assert');
assert.notDeepEqual({a:1}, {a:'1'});
// AssertionError: { a: 1 } notDeepEqual { a: '1' }
assert.notDeepStrictEqual({a:1}, {a:'1'});
// OK
If the values are deeply and strictly equal, an AssertionError is thrown
with a message property set equal to the value of the message parameter. If
the message parameter is undefined, a default error message is assigned.
assert.notEqual(actual, expected[, message])#
Tests shallow, coercive inequality with the not equal comparison operator
( != ).
const assert = require('assert');
assert.notEqual(1, 2);
// OK
assert.notEqual(1, 1);
// AssertionError: 1 != 1
assert.notEqual(1, '1');
// AssertionError: 1 != '1'
If the values are equal, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
assert.notStrictEqual(actual, expected[, message])#
Tests strict inequality as determined by the strict not equal operator
( !== ).
const assert = require('assert');
assert.notStrictEqual(1, 2);
// OK
assert.notStrictEqual(1, 1);
// AssertionError: 1 !== 1
assert.notStrictEqual(1, '1');
// OK
If the values are strictly equal, an AssertionError is thrown with a
message property set equal to the value of the message parameter. If the
message parameter is undefined, a default error message is assigned.
assert.ok(value[, message])#
Tests if value is truthy. It is equivalent to
assert.equal(!!value, true, message).
If value is not truthy, an AssertionError is thrown with a message
property set equal to the value of the message parameter. If the message
parameter is undefined, a default error message is assigned.
const assert = require('assert');
assert.ok(true);
// OK
assert.ok(1);
// OK
assert.ok(false);
// throws "AssertionError: false == true"
assert.ok(0);
// throws "AssertionError: 0 == true"
assert.ok(false, 'it\'s false');
// throws "AssertionError: it's false"
assert.strictEqual(actual, expected[, message])#
Tests strict equality as determined by the strict equality operator ( === ).
const assert = require('assert');
assert.strictEqual(1, 2);
// AssertionError: 1 === 2
assert.strictEqual(1, 1);
// OK
assert.strictEqual(1, '1');
// AssertionError: 1 === '1'
If the values are not strictly equal, an AssertionError is thrown with a
message property set equal to the value of the message parameter. If the
message parameter is undefined, a default error message is assigned.
assert.throws(block[, error][, message])#
Expects the function block to throw an error.
If specified, error can be a constructor, RegExp, or validation
function.
If specified, message will be the message provided by the AssertionError if
the block fails to throw.
Validate instanceof using constructor:
assert.throws(
() => {
throw new Error('Wrong value');
},
Error
);
Validate error message using RegExp:
assert.throws(
() => {
throw new Error('Wrong value');
},
/value/
);
Custom error validation:
assert.throws(
() => {
throw new Error('Wrong value');
},
function(err) {
if ( (err instanceof Error) && /value/.test(err) ) {
return true;
}
},
'unexpected error'
);
Note that error can not be a string. If a string is provided as the second
argument, then error is assumed to be omitted and the string will be used for
message instead. This can lead to easy-to-miss mistakes:
// THIS IS A MISTAKE! DO NOT DO THIS!
assert.throws(myFunction, 'missing foo', 'did not throw with expected message');
// Do this instead.
assert.throws(myFunction, /missing foo/, 'did not throw with expected message');
Buffer#
Stability: 2 - Stable
Prior to the introduction of TypedArray in ECMAScript 2015 (ES6), the
JavaScript language had no mechanism for reading or manipulating streams
of binary data. The Buffer class was introduced as part of the Node.js
API to make it possible to interact with octet streams in the context of things
like TCP streams and file system operations.
Now that TypedArray has been added in ES6, the Buffer class implements the
Uint8Array API in a manner that is more optimized and suitable for Node.js'
use cases.
Instances of the Buffer class are similar to arrays of integers but
correspond to fixed-sized, raw memory allocations outside the V8 heap.
The size of the Buffer is established when it is created and cannot be
resized.
The Buffer class is a global within Node.js, making it unlikely that one
would need to ever use require('buffer').Buffer.
Examples:
// Creates a zero-filled Buffer of length 10.
const buf1 = Buffer.alloc(10);
// Creates a Buffer of length 10, filled with 0x1.
const buf2 = Buffer.alloc(10, 1);
// Creates an uninitialized buffer of length 10.
// This is faster than calling Buffer.alloc() but the returned
// Buffer instance might contain old data that needs to be
// overwritten using either fill() or write().
const buf3 = Buffer.allocUnsafe(10);
// Creates a Buffer containing [0x1, 0x2, 0x3].
const buf4 = Buffer.from([1, 2, 3]);
// Creates a Buffer containing ASCII bytes [0x74, 0x65, 0x73, 0x74].
const buf5 = Buffer.from('test');
// Creates a Buffer containing UTF-8 bytes [0x74, 0xc3, 0xa9, 0x73, 0x74].
const buf6 = Buffer.from('tést', 'utf8');
Buffer.from(), Buffer.alloc(), and Buffer.allocUnsafe()#
In versions of Node.js prior to v6, Buffer instances were created using the
Buffer constructor function, which allocates the returned Buffer
differently based on what arguments are provided:
- Passing a number as the first argument to
Buffer()(e.g.new Buffer(10)), allocates a newBufferobject of the specified size. The memory allocated for suchBufferinstances is not initialized and can contain sensitive data. SuchBufferinstances must be initialized manually by using eitherbuf.fill(0)or by writing to theBuffercompletely. While this behavior is intentional to improve performance, development experience has demonstrated that a more explicit distinction is required between creating a fast-but-uninitializedBufferversus creating a slower-but-saferBuffer. - Passing a string, array, or
Bufferas the first argument copies the passed object's data into theBuffer. - Passing an
ArrayBufferreturns aBufferthat shares allocated memory with the givenArrayBuffer.
Because the behavior of new Buffer() changes significantly based on the type
of value passed as the first argument, applications that do not properly
validate the input arguments passed to new Buffer(), or that fail to
appropriately initialize newly allocated Buffer content, can inadvertently
introduce security and reliability issues into their code.
To make the creation of Buffer instances more reliable and less error prone,
the various forms of the new Buffer() constructor have been deprecated
and replaced by separate Buffer.from(), Buffer.alloc(), and
Buffer.allocUnsafe() methods.
Developers should migrate all existing uses of the new Buffer() constructors
to one of these new APIs.
Buffer.from(array)returns a newBuffercontaining a copy of the provided octets.Buffer.from(arrayBuffer[, byteOffset [, length]])returns a newBufferthat shares the same allocated memory as the givenArrayBuffer.Buffer.from(buffer)returns a newBuffercontaining a copy of the contents of the givenBuffer.Buffer.from(string[, encoding])returns a newBuffercontaining a copy of the provided string.Buffer.alloc(size[, fill[, encoding]])returns a "filled"Bufferinstance of the specified size. This method can be significantly slower thanBuffer.allocUnsafe(size)but ensures that newly createdBufferinstances never contain old and potentially sensitive data.Buffer.allocUnsafe(size)andBuffer.allocUnsafeSlow(size)each return a newBufferof the specifiedsizewhose content must be initialized using eitherbuf.fill(0)or written to completely.
Buffer instances returned by Buffer.allocUnsafe() may be allocated off
a shared internal memory pool if size is less than or equal to half
Buffer.poolSize. Instances returned by Buffer.allocUnsafeSlow() never
use the shared internal memory pool.
The --zero-fill-buffers command line option#
Node.js can be started using the --zero-fill-buffers command line option to
force all newly allocated Buffer instances created using either
new Buffer(size), Buffer.allocUnsafe(), Buffer.allocUnsafeSlow() or
new SlowBuffer(size) to be automatically zero-filled upon creation. Use of
this flag changes the default behavior of these methods and can have a significant
impact on performance. Use of the --zero-fill-buffers option is recommended
only when necessary to enforce that newly allocated Buffer instances cannot
contain potentially sensitive data.
Example:
$ node --zero-fill-buffers
> Buffer.allocUnsafe(5);
<Buffer 00 00 00 00 00>
What makes Buffer.allocUnsafe() and Buffer.allocUnsafeSlow() "unsafe"?#
When calling Buffer.allocUnsafe() and Buffer.allocUnsafeSlow(), the
segment of allocated memory is uninitialized (it is not zeroed-out). While
this design makes the allocation of memory quite fast, the allocated segment of
memory might contain old data that is potentially sensitive. Using a Buffer
created by Buffer.allocUnsafe() without completely overwriting the memory
can allow this old data to be leaked when the Buffer memory is read.
While there are clear performance advantages to using Buffer.allocUnsafe(),
extra care must be taken in order to avoid introducing security
vulnerabilities into an application.
Buffers and Character Encodings#
Buffer instances are commonly used to represent sequences of encoded characters
such as UTF-8, UCS2, Base64 or even Hex-encoded data. It is possible to
convert back and forth between Buffer instances and ordinary JavaScript strings
by using an explicit character encoding.
Example:
const buf = Buffer.from('hello world', 'ascii');
// Prints: 68656c6c6f20776f726c64
console.log(buf.toString('hex'));
// Prints: aGVsbG8gd29ybGQ=
console.log(buf.toString('base64'));
The character encodings currently supported by Node.js include:
'ascii'- for 7-bit ASCII data only. This encoding is fast and will strip the high bit if set.'utf8'- Multibyte encoded Unicode characters. Many web pages and other document formats use UTF-8.'utf16le'- 2 or 4 bytes, little-endian encoded Unicode characters. Surrogate pairs (U+10000 to U+10FFFF) are supported.'ucs2'- Alias of'utf16le'.'base64'- Base64 encoding. When creating aBufferfrom a string, this encoding will also correctly accept "URL and Filename Safe Alphabet" as specified in RFC4648, Section 5.'latin1'- A way of encoding theBufferinto a one-byte encoded string (as defined by the IANA in RFC1345, page 63, to be the Latin-1 supplement block and C0/C1 control codes).'binary'- Alias for'latin1'.'hex'- Encode each byte as two hexadecimal characters.
Note: Today's browsers follow the WHATWG spec which aliases both 'latin1' and
ISO-8859-1 to win-1252. This means that while doing something like http.get(),
if the returned charset is one of those listed in the WHATWG spec it's possible
that the server actually returned win-1252-encoded data, and using 'latin1'
encoding may incorrectly decode the characters.
Buffers and TypedArray#
Buffer instances are also Uint8Array instances. However, there are subtle
incompatibilities with the TypedArray specification in ECMAScript 2015.
For example, while ArrayBuffer#slice() creates a copy of the slice, the
implementation of Buffer#slice() creates a view over the
existing Buffer without copying, making Buffer#slice() far
more efficient.
It is also possible to create new TypedArray instances from a Buffer with
the following caveats:
The
Bufferobject's memory is copied to theTypedArray, not shared.The
Bufferobject's memory is interpreted as an array of distinct elements, and not as a byte array of the target type. That is,new Uint32Array(Buffer.from([1, 2, 3, 4]))creates a 4-elementUint32Arraywith elements[1, 2, 3, 4], not aUint32Arraywith a single element[0x1020304]or[0x4030201].
It is possible to create a new Buffer that shares the same allocated memory as
a TypedArray instance by using the TypeArray object's .buffer property.
Example:
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// Copies the contents of `arr`
const buf1 = Buffer.from(arr);
// Shares memory with `arr`
const buf2 = Buffer.from(arr.buffer);
// Prints: <Buffer 88 a0>
console.log(buf1);
// Prints: <Buffer 88 13 a0 0f>
console.log(buf2);
arr[1] = 6000;
// Prints: <Buffer 88 a0>
console.log(buf1);
// Prints: <Buffer 88 13 70 17>
console.log(buf2);
Note that when creating a Buffer using a TypedArray's .buffer, it is
possible to use only a portion of the underlying ArrayBuffer by passing in
byteOffset and length parameters.
Example:
const arr = new Uint16Array(20);
const buf = Buffer.from(arr.buffer, 0, 16);
// Prints: 16
console.log(buf.length);
The Buffer.from() and TypedArray.from() have different signatures and
implementations. Specifically, the TypedArray variants accept a second
argument that is a mapping function that is invoked on every element of the
typed array:
TypedArray.from(source[, mapFn[, thisArg]])
The Buffer.from() method, however, does not support the use of a mapping
function:
Buffer.from(array)Buffer.from(buffer)Buffer.from(arrayBuffer[, byteOffset [, length]])Buffer.from(string[, encoding])
Buffers and ES6 iteration#
Buffer instances can be iterated over using the ECMAScript 2015 (ES6) for..of
syntax.
Example:
const buf = Buffer.from([1, 2, 3]);
// Prints:
// 1
// 2
// 3
for (var b of buf) {
console.log(b);
}
Additionally, the buf.values(), buf.keys(), and
buf.entries() methods can be used to create iterators.
Class: Buffer#
The Buffer class is a global type for dealing with binary data directly.
It can be constructed in a variety of ways.
new Buffer(array)#
Stability: 0 - Deprecated: Use Buffer.from(array) instead.array<Array> An array of bytes to copy from
Allocates a new Buffer using an array of octets.
Example:
// Creates a new Buffer containing the ASCII bytes of the string 'buffer'
const buf = new Buffer([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
new Buffer(buffer)#
Stability: 0 - Deprecated: Use Buffer.from(buffer) instead.buffer<Buffer> An existingBufferto copy data from
Copies the passed buffer data onto a new Buffer instance.
Example:
const buf1 = new Buffer('buffer');
const buf2 = new Buffer(buf1);
buf1[0] = 0x61;
// Prints: auffer
console.log(buf1.toString());
// Prints: buffer
console.log(buf2.toString());
new Buffer(arrayBuffer[, byteOffset [, length]])#
Stability: 0 - Deprecated: Use Buffer.from(arrayBuffer[, byteOffset [, length]]) instead.arrayBuffer<ArrayBuffer> The.bufferproperty of aTypedArrayorArrayBufferbyteOffset<Integer> Where to start copying fromarrayBuffer. Default:0length<Integer> How many bytes to copy fromarrayBuffer. Default:arrayBuffer.length - byteOffset
When passed a reference to the .buffer property of a TypedArray instance,
the newly created Buffer will share the same allocated memory as the
TypedArray.
The optional byteOffset and length arguments specify a memory range within
the arrayBuffer that will be shared by the Buffer.
Example:
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// Shares memory with `arr`
const buf = new Buffer(arr.buffer);
// Prints: <Buffer 88 13 a0 0f>
console.log(buf);
// Changing the original Uint16Array changes the Buffer also
arr[1] = 6000;
// Prints: <Buffer 88 13 70 17>
console.log(buf);
new Buffer(size)#
Stability: 0 - Deprecated: UseBuffer.alloc()instead (also seeBuffer.allocUnsafe()).
size<Integer> The desired length of the newBuffer
Allocates a new Buffer of size bytes. The size must be less than or equal
to the value of buffer.kMaxLength. Otherwise, a RangeError is thrown.
A zero-length Buffer will be created if size <= 0.
Unlike ArrayBuffers, the underlying memory for Buffer instances
created in this way is not initialized. The contents of a newly created Buffer
are unknown and could contain sensitive data. Use
Buffer.alloc(size) instead to initialize a Buffer to zeroes.
Example:
const buf = new Buffer(5);
// Prints: (contents may vary): <Buffer 78 e0 82 02 01>
console.log(buf);
buf.fill(0);
// Prints: <Buffer 00 00 00 00 00>
console.log(buf);
new Buffer(string[, encoding])#
Stability: 0 - Deprecated: Use Buffer.from(string[, encoding]) instead.
Creates a new Buffer containing the given JavaScript string string. If
provided, the encoding parameter identifies the character encoding of string.
Examples:
const buf1 = new Buffer('this is a tést');
// Prints: this is a tést
console.log(buf1.toString());
// Prints: this is a tC)st
console.log(buf1.toString('ascii'));
const buf2 = new Buffer('7468697320697320612074c3a97374', 'hex');
// Prints: this is a tést
console.log(buf2.toString());
Class Method: Buffer.alloc(size[, fill[, encoding]])#
size<Integer> The desired length of the newBufferfill<String> | <Buffer> | <Integer> A value to pre-fill the newBufferwith. Default:0encoding<String> Iffillis a string, this is its encoding. Default:'utf8'
Allocates a new Buffer of size bytes. If fill is undefined, the
Buffer will be zero-filled.
Example:
const buf = Buffer.alloc(5);
// Prints: <Buffer 00 00 00 00 00>
console.log(buf);
The size must be less than or equal to the value of buffer.kMaxLength.
Otherwise, a RangeError is thrown. A zero-length Buffer will be created if
size <= 0.
If fill is specified, the allocated Buffer will be initialized by calling
buf.fill(fill).
Example:
const buf = Buffer.alloc(5, 'a');
// Prints: <Buffer 61 61 61 61 61>
console.log(buf);
If both fill and encoding are specified, the allocated Buffer will be
initialized by calling buf.fill(fill, encoding).
Example:
const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
// Prints: <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
console.log(buf);
Calling Buffer.alloc() can be significantly slower than the alternative
Buffer.allocUnsafe() but ensures that the newly created Buffer instance
contents will never contain sensitive data.
A TypeError will be thrown if size is not a number.
Class Method: Buffer.allocUnsafe(size)#
size<Integer> The desired length of the newBuffer
Allocates a new non-zero-filled Buffer of size bytes. The size must
be less than or equal to the value of buffer.kMaxLength. Otherwise, a
RangeError is thrown. A zero-length Buffer will be created if size <= 0.
The underlying memory for Buffer instances created in this way is not
initialized. The contents of the newly created Buffer are unknown and
may contain sensitive data. Use Buffer.alloc() instead to initialize
Buffer instances to zeroes.
Example:
const buf = Buffer.allocUnsafe(5);
// Prints: (contents may vary): <Buffer 78 e0 82 02 01>
console.log(buf);
buf.fill(0);
// Prints: <Buffer 00 00 00 00 00>
console.log(buf);
A TypeError will be thrown if size is not a number.
Note that the Buffer module pre-allocates an internal Buffer instance of
size Buffer.poolSize that is used as a pool for the fast allocation of new
Buffer instances created using Buffer.allocUnsafe() and the deprecated
new Buffer(size) constructor only when size is less than or equal to
Buffer.poolSize >> 1 (floor of Buffer.poolSize divided by two).
Use of this pre-allocated internal memory pool is a key difference between
calling Buffer.alloc(size, fill) vs. Buffer.allocUnsafe(size).fill(fill).
Specifically, Buffer.alloc(size, fill) will never use the internal Buffer
pool, while Buffer.allocUnsafe(size).fill(fill) will use the internal
Buffer pool if size is less than or equal to half Buffer.poolSize. The
difference is subtle but can be important when an application requires the
additional performance that Buffer.allocUnsafe() provides.
Class Method: Buffer.allocUnsafeSlow(size)#
size<Integer> The desired length of the newBuffer
Allocates a new non-zero-filled and non-pooled Buffer of size bytes. The
size must be less than or equal to the value of buffer.kMaxLength.
Otherwise, a RangeError is thrown. A zero-length Buffer will be created if
size <= 0.
The underlying memory for Buffer instances created in this way is not
initialized. The contents of the newly created Buffer are unknown and
may contain sensitive data. Use buf.fill(0) to initialize such
Buffer instances to zeroes.
When using Buffer.allocUnsafe() to allocate new Buffer instances,
allocations under 4KB are, by default, sliced from a single pre-allocated
Buffer. This allows applications to avoid the garbage collection overhead of
creating many individually allocated Buffer instances. This approach improves
both performance and memory usage by eliminating the need to track and cleanup as
many Persistent objects.
However, in the case where a developer may need to retain a small chunk of
memory from a pool for an indeterminate amount of time, it may be appropriate
to create an un-pooled Buffer instance using Buffer.allocUnsafeSlow() then
copy out the relevant bits.
Example:
// Need to keep around a few small chunks of memory
const store = [];
socket.on('readable', () => {
const data = socket.read();
// Allocate for retained data
const sb = Buffer.allocUnsafeSlow(10);
// Copy the data into the new allocation
data.copy(sb, 0, 0, 10);
store.push(sb);
});
Use of Buffer.allocUnsafeSlow() should be used only as a last resort after
a developer has observed undue memory retention in their applications.
A TypeError will be thrown if size is not a number.
Class Method: Buffer.byteLength(string[, encoding])#
string<String> | <Buffer> | <TypedArray> | <DataView> | <ArrayBuffer> A value to calculate the length ofencoding<String> Ifstringis a string, this is its encoding. Default:'utf8'- Returns: <Integer> The number of bytes contained within
string
Returns the actual byte length of a string. This is not the same as
String.prototype.length since that returns the number of characters in
a string.
Example:
const str = '\u00bd + \u00bc = \u00be';
// Prints: ½ + ¼ = ¾: 9 characters, 12 bytes
console.log(`${str}: ${str.length} characters, ` +
`${Buffer.byteLength(str, 'utf8')} bytes`);
When string is a Buffer/DataView/TypedArray/ArrayBuffer, the
actual byte length is returned.
Otherwise, converts to String and returns the byte length of string.
Class Method: Buffer.compare(buf1, buf2)#
Compares buf1 to buf2 typically for the purpose of sorting arrays of
Buffer instances. This is equivalent to calling
buf1.compare(buf2).
Example:
const buf1 = Buffer.from('1234');
const buf2 = Buffer.from('0123');
const arr = [buf1, buf2];
// Prints: [ <Buffer 30 31 32 33>, <Buffer 31 32 33 34> ]
// (This result is equal to: [buf2, buf1])
console.log(arr.sort(Buffer.compare));
Class Method: Buffer.concat(list[, totalLength])#
list<Array> List ofBufferinstances to concattotalLength<Integer> Total length of theBufferinstances inlistwhen concatenated- Returns: <Buffer>
Returns a new Buffer which is the result of concatenating all the Buffer
instances in the list together.
If the list has no items, or if the totalLength is 0, then a new zero-length
Buffer is returned.
If totalLength is not provided, it is calculated from the Buffer instances
in list. This however causes an additional loop to be executed in order to
calculate the totalLength, so it is faster to provide the length explicitly if
it is already known.
Example: Create a single Buffer from a list of three Buffer instances
const buf1 = Buffer.alloc(10);
const buf2 = Buffer.alloc(14);
const buf3 = Buffer.alloc(18);
const totalLength = buf1.length + buf2.length + buf3.length;
// Prints: 42
console.log(totalLength);
const bufA = Buffer.concat([buf1, buf2, buf3], totalLength);
// Prints: <Buffer 00 00 00 00 ...>
console.log(bufA);
// Prints: 42
console.log(bufA.length);
Class Method: Buffer.from(array)#
array<Array>
Allocates a new Buffer using an array of octets.
Example:
// Creates a new Buffer containing ASCII bytes of the string 'buffer'
const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
A TypeError will be thrown if array is not an Array.
Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])#
arrayBuffer<ArrayBuffer> The.bufferproperty of aTypedArrayorArrayBufferbyteOffset<Integer> Where to start copying fromarrayBuffer. Default:0length<Integer> How many bytes to copy fromarrayBuffer. Default:arrayBuffer.length - byteOffset
When passed a reference to the .buffer property of a TypedArray instance,
the newly created Buffer will share the same allocated memory as the
TypedArray.
Example:
const arr = new Uint16Array(2);
arr[0] = 5000;
arr[1] = 4000;
// Shares memory with `arr`
const buf = Buffer.from(arr.buffer);
// Prints: <Buffer 88 13 a0 0f>
console.log(buf);
// Changing the original Uint16Array changes the Buffer also
arr[1] = 6000;
// Prints: <Buffer 88 13 70 17>
console.log(buf);
The optional byteOffset and length arguments specify a memory range within
the arrayBuffer that will be shared by the Buffer.
Example:
const ab = new ArrayBuffer(10);
const buf = Buffer.from(ab, 0, 2);
// Prints: 2
console.log(buf.length);
A TypeError will be thrown if arrayBuffer is not an ArrayBuffer.
Class Method: Buffer.from(buffer)#
buffer<Buffer> An existingBufferto copy data from
Copies the passed buffer data onto a new Buffer instance.
Example:
const buf1 = Buffer.from('buffer');
const buf2 = Buffer.from(buf1);
buf1[0] = 0x61;
// Prints: auffer
console.log(buf1.toString());
// Prints: buffer
console.log(buf2.toString());
A TypeError will be thrown if buffer is not a Buffer.
Class Method: Buffer.from(string[, encoding])#
Creates a new Buffer containing the given JavaScript string string. If
provided, the encoding parameter identifies the character encoding of string.
Examples:
const buf1 = Buffer.from('this is a tést');
// Prints: this is a tést
console.log(buf1.toString());
// Prints: this is a tC)st
console.log(buf1.toString('ascii'));
const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
// Prints: this is a tést
console.log(buf2.toString());
A TypeError will be thrown if str is not a string.
Class Method: Buffer.isBuffer(obj)#
Returns true if obj is a Buffer, false otherwise.
Class Method: Buffer.isEncoding(encoding)#
Returns true if encoding contains a supported character encoding, or false
otherwise.
Class Property: Buffer.poolSize#
- <Integer> Default:
8192
This is the number of bytes used to determine the size of pre-allocated, internal
Buffer instances used for pooling. This value may be modified.
buf[index]#
The index operator [index] can be used to get and set the octet at position
index in buf. The values refer to individual bytes, so the legal value
range is between 0x00 and 0xFF (hex) or 0 and 255 (decimal).
Example: Copy an ASCII string into a Buffer, one byte at a time
const str = 'Node.js';
const buf = Buffer.allocUnsafe(str.length);
for (let i = 0; i < str.length ; i++) {
buf[i] = str.charCodeAt(i);
}
// Prints: Node.js
console.log(buf.toString('ascii'));
buf.compare(target[, targetStart[, targetEnd[, sourceStart[, sourceEnd]]]])#
target<Buffer> ABufferto compare totargetStart<Integer> The offset withintargetat which to begin comparison. Default:0targetEnd<Integer> The offset withtargetat which to end comparison (not inclusive). Ignored whentargetStartisundefined. Default:target.lengthsourceStart<Integer> The offset withinbufat which to begin comparison. Ignored whentargetStartisundefined. Default:0sourceEnd<Integer> The offset withinbufat which to end comparison (not inclusive). Ignored whentargetStartisundefined. Default:buf.length- Returns: <Integer>
Compares buf with target and returns a number indicating whether buf
comes before, after, or is the same as target in sort order.
Comparison is based on the actual sequence of bytes in each Buffer.
0is returned iftargetis the same asbuf1is returned iftargetshould come beforebufwhen sorted.-1is returned iftargetshould come afterbufwhen sorted.
Examples:
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('BCD');
const buf3 = Buffer.from('ABCD');
// Prints: 0
console.log(buf1.compare(buf1));
// Prints: -1
console.log(buf1.compare(buf2));
// Prints: -1
console.log(buf1.compare(buf3));
// Prints: 1
console.log(buf2.compare(buf1));
// Prints: 1
console.log(buf2.compare(buf3));
// Prints: [ <Buffer 41 42 43>, <Buffer 41 42 43 44>, <Buffer 42 43 44> ]
// (This result is equal to: [buf1, buf3, buf2])
console.log([buf1, buf2, buf3].sort(Buffer.compare));
The optional targetStart, targetEnd, sourceStart, and sourceEnd
arguments can be used to limit the comparison to specific ranges within target
and buf respectively.
Examples:
const buf1 = Buffer.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
const buf2 = Buffer.from([5, 6, 7, 8, 9, 1, 2, 3, 4]);
// Prints: 0
console.log(buf1.compare(buf2, 5, 9, 0, 4));
// Prints: -1
console.log(buf1.compare(buf2, 0, 6, 4));
// Prints: 1
console.log(buf1.compare(buf2, 5, 6, 5));
A RangeError will be thrown if: targetStart < 0, sourceStart < 0,
targetEnd > target.byteLength or sourceEnd > source.byteLength.
buf.copy(target[, targetStart[, sourceStart[, sourceEnd]]])#
target<Buffer> ABufferto copy into.targetStart<Integer> The offset withintargetat which to begin copying to. Default:0sourceStart<Integer> The offset withinbufat which to begin copying from. Ignored whentargetStartisundefined. Default:0sourceEnd<Integer> The offset withinbufat which to stop copying (not inclusive). Ignored whensourceStartisundefined. Default:buf.length- Returns: <Integer> The number of bytes copied.
Copies data from a region of buf to a region in target even if the target
memory region overlaps with buf.
Example: Create two Buffer instances, buf1 and buf2, and copy buf1 from
byte 16 through byte 19 into buf2, starting at the 8th byte in buf2
const buf1 = Buffer.allocUnsafe(26);
const buf2 = Buffer.allocUnsafe(26).fill('!');
for (let i = 0 ; i < 26 ; i++) {
// 97 is the decimal ASCII value for 'a'
buf1[i] = i + 97;
}
buf1.copy(buf2, 8, 16, 20);
// Prints: !!!!!!!!qrst!!!!!!!!!!!!!
console.log(buf2.toString('ascii', 0, 25));
Example: Create a single Buffer and copy data from one region to an
overlapping region within the same Buffer
const buf = Buffer.allocUnsafe(26);
for (var i = 0 ; i < 26 ; i++) {
// 97 is the decimal ASCII value for 'a'
buf[i] = i + 97;
}
buf.copy(buf, 0, 4, 10);
// Prints: efghijghijklmnopqrstuvwxyz
console.log(buf.toString());
buf.entries()#
- Returns: <Iterator>
Creates and returns an iterator of [index, byte] pairs from the contents of
buf.
Example: Log the entire contents of a Buffer
const buf = Buffer.from('buffer');
// Prints:
// [0, 98]
// [1, 117]
// [2, 102]
// [3, 102]
// [4, 101]
// [5, 114]
for (var pair of buf.entries()) {
console.log(pair);
}
buf.equals(otherBuffer)#
Returns true if both buf and otherBuffer have exactly the same bytes,
false otherwise.
Examples:
const buf1 = Buffer.from('ABC');
const buf2 = Buffer.from('414243', 'hex');
const buf3 = Buffer.from('ABCD');
// Prints: true
console.log(buf1.equals(buf2));
// Prints: false
console.log(buf1.equals(buf3));
buf.fill(value[, offset[, end]][, encoding])#
value<String> | <Buffer> | <Integer> The value to fillbufwithoffset<Integer> Where to start fillingbuf. Default:0end<Integer> Where to stop fillingbuf(not inclusive). Default:buf.lengthencoding<String> Ifvalueis a string, this is its encoding. Default:'utf8'- Returns: <Buffer> A reference to
buf
Fills buf with the specified value. If the offset and end are not given,
the entire buf will be filled. This is meant to be a small simplification to
allow the creation and filling of a Buffer to be done on a single line.
Example: Fill a Buffer with the ASCII character 'h'
const b = Buffer.allocUnsafe(50).fill('h');
// Prints: hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
console.log(b.toString());
value is coerced to a uint32 value if it is not a String or Integer.
If the final write of a fill() operation falls on a multi-byte character,
then only the first bytes of that character that fit into buf are written.
Example: Fill a Buffer with a two-byte character
// Prints: <Buffer c8 a2 c8>
console.log(Buffer.allocUnsafe(3).fill('\u0222'));
buf.indexOf(value[, byteOffset][, encoding])#
value<String> | <Buffer> | <Integer> What to search forbyteOffset<Integer> Where to begin searching inbuf. Default:0encoding<String> Ifvalueis a string, this is its encoding. Default:'utf8'- Returns: <Integer> The index of the first occurrence of
valueinbufor-1ifbufdoes not containvalue
If value is:
- a string,
valueis interpreted according to the character encoding inencoding. - a
Buffer,valuewill be used in its entirety. To compare a partialBufferusebuf.slice(). - a number,
valuewill be interpreted as an unsigned 8-bit integer value between0and255.
Examples:
const buf = Buffer.from('this is a buffer');
// Prints: 0
console.log(buf.indexOf('this')));
// Prints: 2
console.log(buf.indexOf('is'));
// Prints: 8
console.log(buf.indexOf(Buffer.from('a buffer')));
// Prints: 8
// (97 is the decimal ASCII value for 'a')
console.log(buf.indexOf(97));
// Prints: -1
console.log(buf.indexOf(Buffer.from('a buffer example')));
// Prints: 8
console.log(buf.indexOf(Buffer.from('a buffer example').slice(0, 8)));
const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
// Prints: 4
console.log(utf16Buffer.indexOf('\u03a3', 0, 'ucs2'));
// Prints: 6
console.log(utf16Buffer.indexOf('\u03a3', -4, 'ucs2'));
buf.includes(value[, byteOffset][, encoding])#
value<String> | <Buffer> | <Integer> What to search forbyteOffset<Integer> Where to begin searching inbuf. Default:0encoding<String> Ifvalueis a string, this is its encoding. Default:'utf8'- Returns: <Boolean>
trueifvaluewas found inbuf,falseotherwise
Equivalent to buf.indexOf() !== -1.
Examples:
const buf = Buffer.from('this is a buffer');
// Prints: true
console.log(buf.includes('this'));
// Prints: true
console.log(buf.includes('is'));
// Prints: true
console.log(buf.includes(Buffer.from('a buffer')));
// Prints: true
// (97 is the decimal ASCII value for 'a')
console.log(buf.includes(97));
// Prints: false
console.log(buf.includes(Buffer.from('a buffer example')));
// Prints: true
console.log(buf.includes(Buffer.from('a buffer example').slice(0, 8)));
// Prints: false
console.log(buf.includes('this', 4));
buf.keys()#
- Returns: <Iterator>
Creates and returns an iterator of buf keys (indices).
Example:
const buf = Buffer.from('buffer');
// Prints:
// 0
// 1
// 2
// 3
// 4
// 5
for (var key of buf.keys()) {
console.log(key);
}
buf.lastIndexOf(value[, byteOffset][, encoding])#
value<String> | <Buffer> | <Integer> What to search forbyteOffset<Integer> Where to begin searching inbuf(not inclusive). Default:buf.lengthencoding<String> Ifvalueis a string, this is its encoding. Default:'utf8'- Returns: <Integer> The index of the last occurrence of
valueinbufor-1ifbufdoes not containvalue
Identical to buf.indexOf(), except buf is searched from back to front
instead of front to back.
Examples:
const buf = Buffer.from('this buffer is a buffer');
// Prints: 0
console.log(buf.lastIndexOf('this'));
// Prints: 17
console.log(buf.lastIndexOf('buffer'));
// Prints: 17
console.log(buf.lastIndexOf(Buffer.from('buffer')));
// Prints: 15
// (97 is the decimal ASCII value for 'a')
console.log(buf.lastIndexOf(97));
// Prints: -1
console.log(buf.lastIndexOf(Buffer.from('yolo')));
// Prints: 5
console.log(buf.lastIndexOf('buffer', 5));
// Prints: -1
console.log(buf.lastIndexOf('buffer', 4));
const utf16Buffer = Buffer.from('\u039a\u0391\u03a3\u03a3\u0395', 'ucs2');
// Prints: 6
console.log(utf16Buffer.lastIndexOf('\u03a3', null, 'ucs2'));
// Prints: 4
console.log(utf16Buffer.lastIndexOf('\u03a3', -5, 'ucs2'));