diff --git a/doc/api/fs.md b/doc/api/fs.md index 95afa01cbdec7b..5c79709c4c3c90 100644 --- a/doc/api/fs.md +++ b/doc/api/fs.md @@ -393,11 +393,14 @@ changes: * `buffer` {Buffer|TypedArray|DataView} A buffer that will be filled with the file data read. * `offset` {integer} The location in the buffer at which to start filling. -* `length` {integer} The number of bytes to read. + **Default:** `0` +* `length` {integer} The number of bytes to read. **Default:** + `buffer.byteLength - offset` * `position` {integer|bigint|null} The location where to begin reading data from the file. If `null` or `-1`, data will be read from the current file position, and the position will be updated. If `position` is a non-negative integer, the current file position will remain unchanged. + **Default:**: `null` * Returns: {Promise} Fulfills upon success with an object with two properties: * `bytesRead` {integer} The number of bytes read * `buffer` {Buffer|TypedArray|DataView} A reference to the passed in `buffer` diff --git a/lib/internal/fs/promises.js b/lib/internal/fs/promises.js index 43d4ad7c0e9f63..1e9573d0385fd0 100644 --- a/lib/internal/fs/promises.js +++ b/lib/internal/fs/promises.js @@ -670,7 +670,7 @@ async function read(handle, bufferOrParams, offset, length, position) { validateInteger(offset, 'offset', 0); } - length |= 0; + length ??= buffer.byteLength - offset; if (length === 0) return { __proto__: null, bytesRead: length, buffer }; diff --git a/test/parallel/test-fs-promises-file-handle-read.js b/test/parallel/test-fs-promises-file-handle-read.js index 34a70c61d7e445..2e9534c3989906 100644 --- a/test/parallel/test-fs-promises-file-handle-read.js +++ b/test/parallel/test-fs-promises-file-handle-read.js @@ -14,7 +14,7 @@ const assert = require('assert'); const tmpDir = tmpdir.path; async function read(fileHandle, buffer, offset, length, position, options) { - return options.useConf ? + return options?.useConf ? fileHandle.read({ buffer, offset, length, position }) : fileHandle.read(buffer, offset, length, position); } @@ -96,6 +96,21 @@ async function validateReadLength(len) { assert.strictEqual(bytesRead, len); } +async function validateReadWithNoOptions(byte) { + const buf = Buffer.alloc(byte); + const filePath = fixtures.path('x.txt'); + const fileHandle = await open(filePath, 'r'); + let response = await fileHandle.read(buf); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, undefined, 0); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, null, 0); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, undefined, 0, { useConf: true }); + assert.strictEqual(response.bytesRead, byte); + response = await read(fileHandle, buf, 0, null, 0, { useConf: true }); + assert.strictEqual(response.bytesRead, byte); +} (async function() { tmpdir.refresh(); @@ -109,4 +124,6 @@ async function validateReadLength(len) { await validateReadWithPositionZero(); await validateReadLength(0); await validateReadLength(1); + await validateReadWithNoOptions(0); + await validateReadWithNoOptions(1); })().then(common.mustCall());