├── .gitignore └── index.js /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const fs = require("fs"); 3 | const multer = require("multer"); 4 | const path = require("path"); 5 | 6 | const app = express(); 7 | const PORT = 3000; 8 | const LOG_FILE = "server.log"; 9 | 10 | app.use(express.json()); 11 | app.use(express.urlencoded({ extended: true })); 12 | app.use(express.static("public")); 13 | 14 | const storage = multer.diskStorage({ 15 | destination: (req, file, cb) => { 16 | const uploadPath = path.join(__dirname, "uploads"); 17 | if (!fs.existsSync(uploadPath)) fs.mkdirSync(uploadPath); 18 | cb(null, uploadPath); 19 | }, 20 | filename: (req, file, cb) => { 21 | cb(null, Date.now() + "-" + file.originalname); 22 | }, 23 | }); 24 | const upload = multer({ storage }); 25 | 26 | function logMessage(message) { 27 | const logEntry = `[${new Date().toISOString()}] ${message}\n`; 28 | fs.appendFileSync(LOG_FILE, logEntry, "utf8"); 29 | } 30 | 31 | app.get("/", (req, res) => { 32 | logMessage("Home page accessed"); 33 | res.send("Welcome to the Node.js Server!"); 34 | }); 35 | 36 | app.get("/users/:id", (req, res) => { 37 | const userId = req.params.id; 38 | logMessage(`Fetching user data for ID: ${userId}`); 39 | 40 | const users = [ 41 | { id: 1, name: "Alice", email: "alice@example.com" }, 42 | { id: 2, name: "Bob", email: "bob@example.com" }, 43 | { id: 3, name: "Charlie", email: "charlie@example.com" }, 44 | ]; 45 | 46 | const user = users.find((u) => u.id === parseInt(userId)); 47 | if (!user) { 48 | logMessage(`User with ID ${userId} not found`); 49 | return res.status(404).json({ error: "User not found" }); 50 | } 51 | 52 | res.json(user); 53 | }); 54 | 55 | app.post("/upload", upload.single("file"), (req, res) => { 56 | if (!req.file) { 57 | logMessage("File upload failed: No file provided"); 58 | return res.status(400).json({ error: "No file uploaded" }); 59 | } 60 | 61 | logMessage(`File uploaded: ${req.file.filename}`); 62 | res.json({ message: "File uploaded successfully", filename: req.file.filename }); 63 | }); 64 | 65 | app.use((req, res) => { 66 | logMessage(`404 - Not Found: ${req.originalUrl}`); 67 | res.status(404).json({ error: "Route not found" }); 68 | }); 69 | 70 | app.use((err, req, res, next) => { 71 | logMessage(`500 - Server Error: ${err.message}`); 72 | res.status(500).json({ error: "Internal Server Error" }); 73 | }); 74 | 75 | app.listen(PORT, () => { 76 | logMessage(`Server running on http://localhost:${PORT}`); 77 | }); 78 | --------------------------------------------------------------------------------