What is formdata-node?
The formdata-node package is a Node.js module that allows you to create, manipulate, and encode multipart/form-data streams. It can be used to submit forms and upload files via HTTP requests in a way that is compatible with browser FormData API.
What are formdata-node's main functionalities?
Creating FormData
This feature allows you to create a new FormData instance and append fields to it, similar to how you would in a browser environment.
const { FormData } = require('formdata-node');
const formData = new FormData();
formData.append('key', 'value');
Appending Files
This feature enables appending files to the FormData instance, which can then be used to upload files to a server.
const { FormData, fileFromPath } = require('formdata-node');
const formData = new FormData();
formData.append('file', fileFromPath('./path/to/file.txt'));
Retrieving FormData Content
This feature allows you to iterate over the entries in the FormData object, enabling you to access the keys and values that have been appended.
const { FormData } = require('formdata-node');
const formData = new FormData();
formData.append('key', 'value');
for (const [key, value] of formData) {
console.log(key, value);
}
Encoding FormData
This feature is used to encode the FormData into a Blob, which can then be used to send the data over an HTTP request.
const { FormData, formDataToBlob } = require('formdata-node');
const formData = new FormData();
formData.append('key', 'value');
const blob = formDataToBlob(formData);
Other packages similar to formdata-node
form-data
The 'form-data' package is similar to 'formdata-node' and is used to create readable 'multipart/form-data' streams. It can be used in the Node.js environment and is compatible with 'request' library. It differs in API and internal implementation but serves a similar purpose.
busboy
Busboy is a Node.js module for parsing incoming HTML form data. It's different from 'formdata-node' as it focuses on parsing form data rather than creating it, but it can handle multipart/form-data, which is commonly used for file uploads.
multiparty
Multiparty is a Node.js module for parsing multipart/form-data requests, which is used for uploading files. Unlike 'formdata-node', which is for creating and encoding form data, 'multiparty' is designed for the server-side to parse incoming data.
FormData
FormData implementation for Node.js. Built over Readable stream and async generators.
Installation
You can install this package from npm:
npm install formdata-node
Or with yarn:
yarn add formdata-node
Usage
Each FormData instance allows you to read its data from Readable
stream,
just use FormData#stream
property for that.
You can send queries via HTTP clients that supports headers setting Readable stream as body.
Let's take a look at minimal example with got:
import FormData from "formdata-node"
import got from "got"
const fd = new FormData()
fd.set("greeting", "Hello, World!")
const options = {
body: fd.stream,
headers: fd.headers
}
got.post("http://example.com", options)
.then(res => console.log("Res: ", res.body))
.catch(err => console.error("Error: ", err))
API
constructor FormData([entries])
Initialize new FormData instance
- {array} [entries = null] – an optional FormData initial entries.
Each initial field should be passed as a collection of the objects
with "name", "value" and "filename" props.
See the FormData#append() for more info about the available format.
Instance properties
boundary -> {string}
Returns a boundary string of the current FormData
instance.
stream -> {stream.Readable}
Returns an internal Readable stream. Use it to send queries, but don't push
anything into it.
Returns object with content-type
header
Instance methods
set(name, value[, filename, options]) -> {void}
Set a new value for an existing key inside FormData,
or add the new field if it does not already exist.
- {string} name – The name of the field whose data is contained in value
- {any} value – The field value. You can pass any JavaScript primitive type (including
null
and undefined
),
Buffer
, stream.Readable
,
ReadableStream
, Blob
or File
.
Note that Arrays and Object will be converted to string by using String function.
You also need compatible polyfills or ponyfills to use ReadableStream, File and Blob as a field value - {string} [filename = undefined] – A filename of given field. Can be added only for
Buffer
and Readable
. - {object} [object = {}] - Additional field options
- {number} [object.size = undefined] – A size of field's content. If it set on a stream, then given stream will be treated as File-like object.
Can be omited for
Blob
, File
and Buffer
values or if you don't know the actual length of the stream.
append(name, value[, filename, options]) -> {void}
Appends a new value onto an existing key inside a FormData object,
or adds the key if it does not already exist.
- {string} name – The name of the field whose data is contained in value
- {any} value – The field value. You can pass any JavaScript primitive type (including
null
and undefined
),
Buffer
, stream.Readable
,
ReadableStream
, Blob
or File
.
Note that Arrays and Object will be converted to string by using String function.
You also need compatible polyfills or ponyfills to use ReadableStream, File and Blob as a field value - {string} [filename = undefined] – A filename of given field. Can be added only for
Buffer
and Readable
. - {number} [object.size = undefined] – A size of field's content. If it set on a stream, then given stream will be treated as File-like object.
Can be omited for
Blob
, File
and Buffer
values or if you don't know the actual length of the stream.
get(name) -> {string | Readable | ReadStream | ReadableStream | File}
Returns the first value associated with the given name.
If the field has Blob
, Buffer
or any Readable
and ReadableStream
(and when options.size is set for this stream) value, the File-like object will be returned.
- {string} name – A name of the value you want to retrieve.
getAll(name) -> {Array<string | Readable | ReadStream | ReadableStream | File>}
Returns all the values associated with a given key from within a FormData object.
If the field has Blob
, Buffer
or any Readable
and ReadableStream
(and when options.size is set for this stream) value, the File-like object will be returned.
- {string} name – A name of the value you want to retrieve.
has(name) -> {boolean}
Check if a field with the given name exists inside FormData.
- {string} – A name of the field you want to test for.
delete(name) -> {void}
Deletes a key and its value(s) from a FormData
object.
- {string} name – The name of the key you want to delete.
getComputedLength() -> {Promise<number | undefined>}
Returns computed length of the FormData content. If FormData instance contains
a stream value with unknown length, the method will always return undefined
.
forEach(callback[, ctx]) -> {void}
Executes a given callback for each field of the FormData instance
- {function} callback – Function to execute for each element, taking three arguments:
- {any} value – A value(s) of the current field.
- {string} name – Name of the current field.
- {FormData} fd – The FormData instance that forEach is being applied to
- {any} [ctx = null] – Value to use as this context when executing the given callback
keys() -> {IterableIterator<string>}
Returns an iterator
allowing to go through the FormData keys
values() -> {IterableIterator<any>}
Returns an iterator
allowing to go through the FormData values
entries() -> {IterableIterator<[string, any]>}
Returns an iterator
allowing to go through the FormData key/value pairs
[Symbol.iterator]() -> {IterableIterator<[string, any]>}
An alias of FormData#entries
[Symbol.asyncIterator]() -> {AsyncIterableIterator<Buffer>}
Returns an async iterator allowing to read a data from internal Readable stream using for-await syntax.
Read the async iteration proposal to get more info about async iterators.
Related links
web-streams-polyfill
a Web Streams, based on the WHATWG spec reference implementation.fetch-blob
a Blob implementation on node.js, originally from node-fetch.then-busboy
is a promise-based wrapper around Busboy.
Process multipart/form-data content and returns it as a single object.
Will be helpful to handle your data on the server-side applications.@octetstream/object-to-form-data
converts JavaScript object to FormData.FormData
interface documentation on MDN