Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions src/createServer.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,84 @@
'use strict';

const http = require('http');
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') {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The server listens for POST requests to /add-expense, but the form submits to /submit-expense. This will cause the form submission to fail.

try {
let body = '';

req.on('data', (chunk) => {
body += chunk.toString();
});

req.on('end', () => {
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;

if (!date || !title || !amount) {
res.writeHead(400);

return res.end('Missing required fields');
}

fs.writeFileSync('db/expense.json', JSON.stringify(expense));

res.writeHead(200, { 'Content-Type': 'application/json' });

res.end(JSON.stringify(expense));
Comment on lines +53 to +55
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Issue: The response after a successful POST is sent as raw JSON with a Content-Type: application/json header. According to the task description, you should return an HTML page that displays the submitted expense as well-formatted JSON (e.g., inside a <pre> tag), not just the JSON string. Please update the response to return HTML as required by the task.


// res.end(`<h1>Date: ${date}</h1>
// <h1>Title: ${title}</h1>
// <h1>Amount: ${amount}</h1>`);
});
} catch (err) {
res.writeHead(500);
res.end('Error parsing form');
}
} else if (req.method === 'GET' && req.url === '/') {
res.statusCode = 200;
res.setHeader('Content-type', 'text/html');

res.end(`<h1>Input data</h1>
<form method="POST" action="/add-expense">
<input name="date" type="date" required>
<input name="title" type="text" required>
<input name="amount" type="number" required>

<button type="submit">Submit</button>
</form>`);
} else {
res.statusCode = 404;
res.end('Page not found');
}
});
}

module.exports = {
Expand Down