4
\$\begingroup\$

this is my first real website I created after learning about web development. It's amazing to me that anyone would spare their free time to code review strangers' code. So thank you in advance. I'd like a general feedback and especially on the caching I implemented. The full Code (with ejs templates and media etc) is on Github. I wrote this half a year ago and just added some more comments so, just ignore the stupid stuff :D. Here's the server code:

const ejs = require("ejs"); // not needed
const marked = require("marked");
const path = require("path");
const fs = require("fs");
const db = require("./mariadb.js");
const config = require("./config.js");
const express = require('express');
const app = express();
// used to be BodyParser.url... now deprecated
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
app.use(express.static('public'))
app.set("view engine","ejs");
app.set('view cache', false);
app.set('views', path.join(__dirname, '/sites'));
app.use("*",(req, res, next) => {
 console.log("-----------------------------");
 console.log("Request:");
 console.log("\tMethod: " +req.method);
 console.log("\tOriginal URL:"+req.originalUrl);
 console.log("\tBase URL:"+req.baseUrl);
 console.log("-----------------------------");
 next();
});
app.use((error,req, res, next) => {
 console.log(error.message)
 res.status(error.code || 500);
 res.send("404 - File Not Found :(");
});
app.get("/", (req,res) => {
 if (fs.existsSync("cache/index.html")){
 fs.readFileSync("cache/index.html",(err,data) => {
 if (!err){
 res.send(data.toString());
 return;
 }
 })
 }
 res.render("index",{"cache": true}, (err,html) => {
 if (err){ throw err;}
 res.send(html)
 fs.mkdirSync("cache",{recursive: true});
 fs.writeFileSync("cache/index.html",html,(err) => {
 if (err){
 console.log(err.message)
 }
 })
 });
})
app.get("/blog/:article", (req,res) => {
 // serve cached page if possible
 if (fs.existsSync("cache"+req.baseUrl+req.path+".html")){
 fs.readFileSync("cache"+req.baseUrl+req.path+".html",(err,data) => {
 if (!err){
 res.send(data.toString());
 return;
 }
 })
 }
 // check db for wanted entry
 db.pool.query("select * from BlogEntries where url=(?);",[req.params.article],(err,rows,meta) => {
 if (err ){ //|(rows.length != 2)
 console.log(err.message | "Weird Amount of Entries from DB" ) ;
 }
 console.log(rows[0].heading);
 // render blogEntry template with queried data
 res.render("blogEntry",{heading: rows[0].heading, bloghtml: marked(rows[0].content)}, (err,html) => {
 if (err){ 
 console.log(err.message);
 res.end()
 return
 }
 // send rendered page
 res.send(html)
 // save rendered page to cache
 fs.mkdirSync(path.dirname("cache"+req.baseUrl+req.path),{recursive: true});
 fs.writeFileSync("cache"+req.baseUrl+req.path+".html",html,(err) => {
 if (err){ console.log(err.message) }
 })
 });
 });
})
app.get("/blog", (req,res) => {
 // would serve cached blogoverview, but as it's dependent on the amount on the blogentries it changes too much to be usefull
 // also: how to find if changed?
 // deleting cached on render of blog page not viable
 /* if (fs.existsSync("cache/blog.html")){
 fs.readFileSync("cache/blog.html",(err,data) => {
 if (!err){
 res.send(data.toString());
 return;
 }
 })
 } */
 db.pool.query("select url,heading,substring(content,1,200) as description from BlogEntries;",(err,rows,meta) => {
 if (err ){ 
 console.log(err.message ) ;
 }
 blogEntries = rows;
 for (let i=0; i< rows.length;i++){
 blogEntries[i].description = marked(rows[i].description)
 }
 console.log(rows[0].heading);
 res.render("blog",{blogEntries: blogEntries}, (err,html) => {
 if (err){ 
 console.log(err.message);
 res.end()
 return
 }
 res.send(html)
 // would save blog overwiev to cache
 /*
 fs.mkdirSync(path.dirname("cache"+req.baseUrl+req.path),{recursive: true});
 fs.writeFileSync("cache"+req.baseUrl+req.path+".html",html,(err) => {
 if (err){ console.log(err.message) }
 })*/
 });
 });
})
app.get("/*", (req,res) => {
 if (fs.existsSync("cache"+req.baseUrl+req.path+".html")){
 fs.readFileSync("cache"+req.baseUrl+req.path+".html",(err,data) => {
 if (!err){
 res.send(data.toString());
 return;
 }
 console.log(err.message)
 })
 }
 res.render((req.baseUrl+req.path).substr(1),{"cache": true}, (err,html) => {
 if (err){ throw err;}
 res.send(html)
 fs.mkdirSync(path.dirname("cache"+req.baseUrl+req.path),{recursive: true});
 fs.writeFileSync("cache"+req.baseUrl+req.path+".html",html,(err) => {
 if (err){
 console.log(err.message)
 }
 })
 });
})
// put data from /new form into db
app.post("/*", (req,res) =>{
 let url = req.body.heading.replace(/[;/?:@&=+,ドル ]/g ,"-")
 db.pool.query("insert into BlogEntries (heading,url,content) values ((?),(?),(?));",[req.body.heading,url,req.body.content]);
 res.status(301).redirect("/new") 
})
// no idea what this does
app.use((error,req, res, next) => {
 console.log(error.message)
 res.status(error.code || 500);
 res.send("404 - File Not Found :(");
});
// starting the server
app.listen(8080, () => console.log("Started Server on Port "+config.port));
jdt
2,4475 silver badges21 bronze badges
asked Oct 16, 2021 at 21:17
\$\endgroup\$
1

0

Know someone who can answer? Share a link to this question via email, Twitter, or Facebook.

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.