Use forms with or without client-side JavaScript--no code duplication required!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

61 regels
1.1 KiB

  1. import { IncomingMessage } from 'http';
  2. import busboy from 'busboy';
  3. export const getBody = (req: IncomingMessage) => new Promise<Buffer>((resolve, reject) => {
  4. let body = Buffer.from('');
  5. req.on('data', (chunk) => {
  6. body = Buffer.concat([body, chunk]);
  7. });
  8. req.on('error', (err) => {
  9. reject(err);
  10. });
  11. req.on('end', () => {
  12. resolve(body);
  13. });
  14. });
  15. export const parseMultipartFormData = async (
  16. req: IncomingMessage,
  17. ) => new Promise<Record<string, unknown>>((resolve, reject) => {
  18. const body: Record<string, unknown> = {};
  19. const bb = busboy({
  20. headers: req.headers,
  21. });
  22. bb.on('file', (name, file, info) => {
  23. const {
  24. filename,
  25. mimeType: mimetype,
  26. } = info;
  27. let fileData = Buffer.from('');
  28. file.on('data', (data) => {
  29. fileData = Buffer.concat([fileData, data]);
  30. });
  31. file.on('close', () => {
  32. body[name] = new File([fileData.buffer], filename, {
  33. type: mimetype,
  34. });
  35. });
  36. });
  37. bb.on('field', (name, value) => {
  38. body[name] = value;
  39. });
  40. bb.on('close', () => {
  41. resolve(body);
  42. });
  43. bb.on('error', (error) => {
  44. reject(error);
  45. });
  46. req.pipe(bb);
  47. });