From ae40cfe9ffa13da1493c7f09ee333f95810f1650 Mon Sep 17 00:00:00 2001 From: Oleksandr Rad Date: Thu, 17 Apr 2025 13:12:39 +0300 Subject: [PATCH 1/3] add solution --- src/createServer.js | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/createServer.js b/src/createServer.js index 1cf1dda..14927fd 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,8 +1,61 @@ 'use strict'; +const http = require('http'); +const { IncomingForm } = require('formidable'); +const fs = require('fs'); + function createServer() { /* Write your code here */ // Return instance of http.Server class + return http.createServer(async (req, res) => { + if (req.method === 'POST' && req.url === '/add-expense') { + const form = new IncomingForm({ multiples: false }); + + try { + const [fields] = await form.parse(req); + + const { date, title, amount } = fields; + + if (!date || !title || !amount) { + res.writeHead(400, { 'Content-Type': 'text/plain' }); + + return res.end('Missing required fields'); + } + + const result = JSON.stringify(fields); + + // console.log('Fields:', fields); + + fs.writeFileSync('db/expense.json', result); + + res.writeHead(200, { 'Content-Type': 'application/json' }); + res.end(result); + + // res.end(`
+ //

Date: ${fields['date']}

+ //

Title: ${fields['title']}

+ //

Amount: ${fields['amount']}

+ // + + + + + + `); + } else { + res.statusCode = 404; + res.end('Page not found'); + } + }); } module.exports = { From e43d19dec90aba9eb8db00fc366feae94f676966 Mon Sep 17 00:00:00 2001 From: Oleksandr Rad Date: Fri, 18 Apr 2025 20:06:57 +0300 Subject: [PATCH 2/3] add second solution --- src/createServer.js | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index 14927fd..affb81c 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -1,7 +1,6 @@ 'use strict'; const http = require('http'); -const { IncomingForm } = require('formidable'); const fs = require('fs'); function createServer() { @@ -9,33 +8,32 @@ function createServer() { // Return instance of http.Server class return http.createServer(async (req, res) => { if (req.method === 'POST' && req.url === '/add-expense') { - const form = new IncomingForm({ multiples: false }); - try { - const [fields] = await form.parse(req); + let body = ''; - const { date, title, amount } = fields; + req.on('data', (chunk) => { + body += chunk.toString(); + }); - if (!date || !title || !amount) { - res.writeHead(400, { 'Content-Type': 'text/plain' }); + req.on('end', () => { + const expense = JSON.parse(body); - return res.end('Missing required fields'); - } + const { date, title, amount } = expense; - const result = JSON.stringify(fields); + if (!date || !title || !amount) { + res.writeHead(400); - // console.log('Fields:', fields); + return res.end('Missing required fields'); + } - fs.writeFileSync('db/expense.json', result); + fs.writeFileSync('db/expense.json', JSON.stringify(expense)); - res.writeHead(200, { 'Content-Type': 'application/json' }); - res.end(result); + const file = fs.readFileSync('db/expense.json'); - // res.end(`
- //

Date: ${fields['date']}

- //

Title: ${fields['title']}

- //

Amount: ${fields['amount']}

- // + res.end(`

Input data

+
From 5693472a38d7f8698bab33cd3369a2c7ab5aef94 Mon Sep 17 00:00:00 2001 From: Oleksandr Rad Date: Fri, 18 Apr 2025 20:22:56 +0300 Subject: [PATCH 3/3] add third solution --- src/createServer.js | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/createServer.js b/src/createServer.js index affb81c..0cebaff 100644 --- a/src/createServer.js +++ b/src/createServer.js @@ -16,7 +16,29 @@ function createServer() { }); req.on('end', () => { - const expense = JSON.parse(body); + let expense; + + const contentType = req.headers['content-type']; + + try { + if (contentType.includes('application/json')) { + expense = JSON.parse(body); + } else if ( + contentType.includes('application/x-www-form-urlencoded') + ) { + const parsed = new URLSearchParams(body); + + expense = Object.fromEntries(parsed.entries()); + } else { + res.writeHead(415); + + return res.end('Unsupported Content-Type'); + } + } catch (err) { + res.writeHead(400); + + return res.end('Invalid body'); + } const { date, title, amount } = expense; @@ -28,11 +50,13 @@ function createServer() { fs.writeFileSync('db/expense.json', JSON.stringify(expense)); - const file = fs.readFileSync('db/expense.json'); + res.writeHead(200, { 'Content-Type': 'application/json' }); + + res.end(JSON.stringify(expense)); - res.statusCode = 200; - res.setHeader('Content-Type', 'application/json'); - res.end(file); + // res.end(`

Date: ${date}

+ //

Title: ${title}

+ //

Amount: ${amount}

`); }); } catch (err) { res.writeHead(500);