mirror of
https://github.com/n8n-io/n8n.git
synced 2026-06-01 17:27:14 +02:00
39 lines
1.1 KiB
TypeScript
39 lines
1.1 KiB
TypeScript
import formidable from 'formidable';
|
|
import type { IncomingMessage } from 'http';
|
|
|
|
const normalizeFormData = <T>(values: Record<string, T | T[]>) => {
|
|
for (const key in values) {
|
|
const value = values[key];
|
|
if (Array.isArray(value) && value.length === 1) {
|
|
values[key] = value[0];
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Creates a function that parses the multipart form data into the request's `body` property
|
|
*/
|
|
export const createMultiFormDataParser = (maxFormDataSizeInMb: number) => {
|
|
return async function parseMultipartFormData(req: IncomingMessage): Promise<{
|
|
data: formidable.Fields;
|
|
files: formidable.Files;
|
|
}> {
|
|
const { encoding } = req;
|
|
|
|
const form = formidable({
|
|
multiples: true,
|
|
encoding: encoding as formidable.BufferEncoding,
|
|
maxFileSize: maxFormDataSizeInMb * 1024 * 1024,
|
|
// TODO: pass a custom `fileWriteStreamHandler` to create binary data files directly
|
|
});
|
|
|
|
return await new Promise((resolve) => {
|
|
form.parse(req, async (_err, data, files) => {
|
|
normalizeFormData(data);
|
|
normalizeFormData(files);
|
|
resolve({ data, files });
|
|
});
|
|
});
|
|
};
|
|
};
|