From cdebc068f322a265999a51d3c856632670b47855 Mon Sep 17 00:00:00 2001 From: raj Date: Mon, 16 Jul 2018 09:41:32 +0100 Subject: [PATCH 1/4] Add solution to part one of the express workshop exercise --- data/posts.json | 4 +- package.json | 13 ++ public/index.html | 6 +- public/script.js | 87 ++++++------- server.js | 36 ++++++ yarn.lock | 316 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 415 insertions(+), 47 deletions(-) create mode 100644 package.json create mode 100644 server.js create mode 100644 yarn.lock diff --git a/data/posts.json b/data/posts.json index b4d8361..bc03dfc 100644 --- a/data/posts.json +++ b/data/posts.json @@ -1,3 +1 @@ -{ - "1467390356291": "This is my very first blog post!" -} +[{"1467390356291":"This is my very first blog post!"},{"blogpost":"first post"}] \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..3ec6e5e --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "name": "express-workshop-forked", + "version": "1.0.0", + "description": "this is to practice basic node and express", + "main": "server.js", + "repository": "git@github.com:rajgthub/express-workshop.git", + "author": "raj ", + "license": "MIT", + "dependencies": { + "express": "^4.16.3", + "express-formidable": "^1.0.0" + } +} diff --git a/public/index.html b/public/index.html index 859031c..990f641 100644 --- a/public/index.html +++ b/public/index.html @@ -14,7 +14,11 @@

Node Girls

- +

Create a blog post

+
+ + +

diff --git a/public/script.js b/public/script.js index b677186..e726bb0 100644 --- a/public/script.js +++ b/public/script.js @@ -5,74 +5,75 @@ if (document.readyState !== 'loading') { } function ready () { - getBlogposts('/get-posts'); - + getBlogposts("/posts"); // send posts to server var form = document.querySelector('form'); form.addEventListener('submit', function (event) { - event.preventDefault(); // prevents the form from contacting our server automatically (we want to do it ourselves) var formActionUrl = form.action; // 'form.action' is the url '/create-post' var formData = new FormData(form); - postBlogposts(formActionUrl, formData); + }); + } /**** * Function definitions ***/ -function postBlogposts (url, data) { - fetch(url, { - method: 'POST', - body: data - }) - .then(function (res) { - res.json() - .then(function (json) { - console.log(json); - addBlogpostsToPage(json); - document.querySelector('form').reset(); - }) +function postBlogposts(url, data) { + fetch(url, { + method: "POST", + body: data + }) + .then(function(res) { + res.json().then(function(json) { + addBlogpostsToPage(json); + document.querySelector("form").reset(); + window.location.href = "http://localhost:3000/posts" + }); }) - .catch(function (err) { - console.error(err) + .catch(function(err) { + console.error(err); }); } -function getBlogposts (url) { + +function getBlogposts(url) { fetch(url, { method: 'GET' }) - .then(function (res) { - res.json() - .then(function (json) { - console.log(json); - addBlogpostsToPage(json); + .then(function (res) { + res.json() + .then(function (json) { + addBlogpostsToPage(json); + }); + }) + .catch(function (err) { + console.error(err) }); - }) - .catch(function (err) { - console.error(err) - }); } function addBlogpostsToPage (data) { - for (var blogpost in data) { - if (data.hasOwnProperty(blogpost)) { - - var postDiv = document.createElement('div'); - var postText = document.createElement('p'); - var thumbnail = document.createElement('img'); - var postContainer = document.querySelector('.post-container'); + data.map(obj => { + for (var blogpost in obj) { + if (obj.hasOwnProperty(blogpost)) { + var postDiv = document.createElement("div"); + var postText = document.createElement("p"); + var thumbnail = document.createElement("img"); + var postContainer = document.querySelector(".post-container"); - thumbnail.src = "./img/logo2.png"; - thumbnail.className = "thumbnail"; - postText.innerHTML = data[blogpost]; - postDiv.className = "post"; + thumbnail.src = "./img/logo2.png"; + thumbnail.className = "thumbnail"; + postText.innerHTML = obj[blogpost]; + postDiv.className = "post"; - postDiv.appendChild(thumbnail); - postDiv.appendChild(postText); - postContainer.appendChild(postDiv); + postDiv.appendChild(thumbnail); + postDiv.appendChild(postText); + postContainer.appendChild(postDiv); + } } - } + }) + + } diff --git a/server.js b/server.js new file mode 100644 index 0000000..4877213 --- /dev/null +++ b/server.js @@ -0,0 +1,36 @@ +//core modules +const fs = require('fs') + +//3rd party modules +const express = require('express') +const formidable = require("express-formidable"); + +//variables +const port = 3000 +const pathPostsFile = __dirname + "/data/posts.json"; + +//create app +const app = express() + +//reading posts +let allposts = [] +allposts = JSON.parse(fs.readFileSync(pathPostsFile).toString()); + +//serving public assets middleware +app.use(express.static('public')) + +app.use(formidable()); + +// router +app.get('/posts', (req, res) => { + res.sendFile(pathPostsFile); +}) +app.post('/create-post', (req, res) => { + const post = req.fields; + allposts.push(post) + fs.writeFileSync(pathPostsFile, JSON.stringify(allposts)); + res.sendFile(pathPostsFile); +}) +app.listen(port, (req, res) => { + console.log("Server is runnig on port:", port); +}) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..0beedd2 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,316 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +accepts@~1.3.5: + version "1.3.5" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + dependencies: + mime-types "~2.1.18" + negotiator "0.6.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +body-parser@1.18.2: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" + dependencies: + bytes "3.0.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" + on-finished "~2.3.0" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + +cookie@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +depd@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + +depd@~1.1.1, depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + +express-formidable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/express-formidable/-/express-formidable-1.0.0.tgz#dc922f0455132322458a9ec1a301d891b3ffca8d" + dependencies: + formidable "^1.0.17" + +express@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" + dependencies: + accepts "~1.3.5" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.1" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.3" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.2" + serve-static "1.13.2" + setprototypeof "1.1.0" + statuses "~1.4.0" + type-is "~1.6.16" + utils-merge "1.0.1" + vary "~1.1.2" + +finalhandler@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.4.0" + unpipe "~1.0.0" + +formidable@^1.0.17: + version "1.2.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" + +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + +http-errors@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" + dependencies: + depd "1.1.1" + inherits "2.0.3" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ipaddr.js@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@~2.1.18: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +mime@1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +negotiator@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + dependencies: + ee-first "1.1.1" + +parseurl@~1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + +proxy-addr@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.3.tgz#355f262505a621646b3130a728eb647e22055341" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.6.0" + +qs@6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +range-parser@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" + dependencies: + bytes "3.0.0" + http-errors "1.6.2" + iconv-lite "0.4.19" + unpipe "1.0.0" + +safe-buffer@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +send@0.16.2: + version "0.16.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.4.0" + +serve-static@1.13.2: + version "1.13.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.2" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + +"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +type-is@~1.6.15, type-is@~1.6.16: + version "1.6.16" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.18" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" From e80f2577b1e250378036dbeb2051805fcacface0 Mon Sep 17 00:00:00 2001 From: raj Date: Mon, 16 Jul 2018 23:52:11 +0100 Subject: [PATCH 2/4] Add handlebarsto the solutions --- data/posts.json | 2 +- package.json | 6 +- router/routes.js | 18 +++++ server.js | 8 +- views/about.hbs | 28 +++++++ views/contact.hbs | 28 +++++++ views/darshboard.hbs | 29 ++++++++ views/partials/footer.hbs | 3 + views/partials/header.hbs | 3 + yarn.lock | 149 ++++++++++++++++++++++++++++++++++++++ 10 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 router/routes.js create mode 100644 views/about.hbs create mode 100644 views/contact.hbs create mode 100644 views/darshboard.hbs create mode 100644 views/partials/footer.hbs create mode 100644 views/partials/header.hbs diff --git a/data/posts.json b/data/posts.json index bc03dfc..a78810c 100644 --- a/data/posts.json +++ b/data/posts.json @@ -1 +1 @@ -[{"1467390356291":"This is my very first blog post!"},{"blogpost":"first post"}] \ No newline at end of file +[{"1467390356291":"This is my very first blog post!"},{"blogpost":"first post"},{"blogpost":"hi"}] \ No newline at end of file diff --git a/package.json b/package.json index 3ec6e5e..6be3042 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,12 @@ "repository": "git@github.com:rajgthub/express-workshop.git", "author": "raj ", "license": "MIT", + "scripts":{ + "dev": "nodemon server.js -e js,hbs" + }, "dependencies": { "express": "^4.16.3", - "express-formidable": "^1.0.0" + "express-formidable": "^1.0.0", + "hbs": "^4.0.1" } } diff --git a/router/routes.js b/router/routes.js new file mode 100644 index 0000000..b50bfb8 --- /dev/null +++ b/router/routes.js @@ -0,0 +1,18 @@ +module.exports = ( app) => { + app.get('/darshboard', (req, res) => { + res.render('darshboard.hbs', { + pageTitle: "Darshboard page", + content: "Welcome to darshboad page", + }) + }) + app.get("/darshboard/contact", (req, res) => { + res.render("contact.hbs", { + pageTitle: "Contact page", + }); + }); + app.get("/darshboard/about", (req, res) => { + res.render("about.hbs", { + pageTitle: "About page", + }); + }); +} \ No newline at end of file diff --git a/server.js b/server.js index 4877213..ec11021 100644 --- a/server.js +++ b/server.js @@ -4,7 +4,7 @@ const fs = require('fs') //3rd party modules const express = require('express') const formidable = require("express-formidable"); - +const hbs = require('hbs') //variables const port = 3000 const pathPostsFile = __dirname + "/data/posts.json"; @@ -18,7 +18,10 @@ allposts = JSON.parse(fs.readFileSync(pathPostsFile).toString()); //serving public assets middleware app.use(express.static('public')) - +hbs.registerPartials(__dirname + '/views/partials') +app.set('view engine', 'hbs') +hbs.registerHelper("getCurrentYear", () => new Date().getFullYear()); +hbs.registerHelper("setUpper", text => text.toUpperCase()); app.use(formidable()); // router @@ -31,6 +34,7 @@ app.post('/create-post', (req, res) => { fs.writeFileSync(pathPostsFile, JSON.stringify(allposts)); res.sendFile(pathPostsFile); }) +require('./router/routes')(app) //routes for handlebars app.listen(port, (req, res) => { console.log("Server is runnig on port:", port); }) \ No newline at end of file diff --git a/views/about.hbs b/views/about.hbs new file mode 100644 index 0000000..7bf6a91 --- /dev/null +++ b/views/about.hbs @@ -0,0 +1,28 @@ + + + + + + + + + Handlebars example + + + +
+ {{> header}} + +
{{setUpper "Welcome to about page"}}
+ {{> footer}} +
+ + + + \ No newline at end of file diff --git a/views/contact.hbs b/views/contact.hbs new file mode 100644 index 0000000..48f1340 --- /dev/null +++ b/views/contact.hbs @@ -0,0 +1,28 @@ + + + + + + + + + Handlebars example + + + +
+ {{> header}} + +
{{setUpper "Welcome to contact page"}}
+ {{> footer}} +
+ + + + \ No newline at end of file diff --git a/views/darshboard.hbs b/views/darshboard.hbs new file mode 100644 index 0000000..61ae727 --- /dev/null +++ b/views/darshboard.hbs @@ -0,0 +1,29 @@ + + + + + + + + + Handlebars example + + + +
+ {{> header}} + +
{{setUpper "Welcome to darshboar page"}}
+ {{> footer}} +
+ + + + \ No newline at end of file diff --git a/views/partials/footer.hbs b/views/partials/footer.hbs new file mode 100644 index 0000000..cd9a77b --- /dev/null +++ b/views/partials/footer.hbs @@ -0,0 +1,3 @@ +
+

Created by Raj - © All rights reserved - {{getCurrentYear}}

+
\ No newline at end of file diff --git a/views/partials/header.hbs b/views/partials/header.hbs new file mode 100644 index 0000000..e4613a3 --- /dev/null +++ b/views/partials/header.hbs @@ -0,0 +1,3 @@ +
+

{{pageTitle}}

+
\ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 0beedd2..3fc075c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,10 +9,26 @@ accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +async@^1.4.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + body-parser@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" @@ -32,6 +48,25 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -54,6 +89,10 @@ debug@2.6.9: dependencies: ms "2.0.0" +decamelize@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" @@ -135,6 +174,10 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +foreachasync@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/foreachasync/-/foreachasync-3.0.0.tgz#5502987dc8714be3392097f32e0071c9dee07cf6" + formidable@^1.0.17: version "1.2.1" resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.1.tgz#70fb7ca0290ee6ff961090415f4b3df3d2082659" @@ -147,6 +190,23 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" +handlebars@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.5.tgz#92c6ed6bb164110c50d4d8d0fbddc70806c6f8e7" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +hbs@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/hbs/-/hbs-4.0.1.tgz#4bfd98650dc8c9dac44b3ca9adf9c098e8bc33b6" + dependencies: + handlebars "4.0.5" + walk "2.3.9" + http-errors@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -177,6 +237,24 @@ ipaddr.js@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.6.0.tgz#e3fa357b773da619f26e95f049d055c72796f86b" +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -203,6 +281,10 @@ mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -217,6 +299,13 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -249,6 +338,16 @@ raw-body@2.3.2: iconv-lite "0.4.19" unpipe "1.0.0" +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -288,6 +387,16 @@ setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -303,6 +412,19 @@ type-is@~1.6.15, type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -314,3 +436,30 @@ utils-merge@1.0.1: vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + +walk@2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/walk/-/walk-2.3.9.tgz#31b4db6678f2ae01c39ea9fb8725a9031e558a7b" + dependencies: + foreachasync "^3.0.0" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" From 635c7afa13d60847bc3afd243ba97a4cca979e34 Mon Sep 17 00:00:00 2001 From: raj Date: Wed, 18 Jul 2018 07:49:56 +0100 Subject: [PATCH 3/4] Add corrected solutions to the problem --- data/posts.json | 2 +- public/script.js | 34 +++++++++++++++------------------- server.js | 3 +-- 3 files changed, 17 insertions(+), 22 deletions(-) diff --git a/data/posts.json b/data/posts.json index a78810c..781e661 100644 --- a/data/posts.json +++ b/data/posts.json @@ -1 +1 @@ -[{"1467390356291":"This is my very first blog post!"},{"blogpost":"first post"},{"blogpost":"hi"}] \ No newline at end of file +[{"blogpost":"first post"},{"blogpost":"hi"},{"blogpost":"post"},{"blogpost":"post"},{"blogpost":"ssffo"},{"blogpost":"one more"}] \ No newline at end of file diff --git a/public/script.js b/public/script.js index e726bb0..a3001bd 100644 --- a/public/script.js +++ b/public/script.js @@ -55,25 +55,21 @@ function getBlogposts(url) { } function addBlogpostsToPage (data) { - data.map(obj => { - for (var blogpost in obj) { - if (obj.hasOwnProperty(blogpost)) { - var postDiv = document.createElement("div"); - var postText = document.createElement("p"); - var thumbnail = document.createElement("img"); - var postContainer = document.querySelector(".post-container"); + data.map(post => { + if (post.hasOwnProperty("blogpost")) { + var postDiv = document.createElement("div"); + var postText = document.createElement("p"); + var thumbnail = document.createElement("img"); + var postContainer = document.querySelector(".post-container"); - thumbnail.src = "./img/logo2.png"; - thumbnail.className = "thumbnail"; - postText.innerHTML = obj[blogpost]; - postDiv.className = "post"; + thumbnail.src = "./img/logo2.png"; + thumbnail.className = "thumbnail"; + postText.innerHTML = post.blogpost; + postDiv.className = "post"; - postDiv.appendChild(thumbnail); - postDiv.appendChild(postText); - postContainer.appendChild(postDiv); - } - } - }) - - + postDiv.appendChild(thumbnail); + postDiv.appendChild(postText); + postContainer.appendChild(postDiv); + } + }) } diff --git a/server.js b/server.js index ec11021..50295e9 100644 --- a/server.js +++ b/server.js @@ -13,8 +13,7 @@ const pathPostsFile = __dirname + "/data/posts.json"; const app = express() //reading posts -let allposts = [] -allposts = JSON.parse(fs.readFileSync(pathPostsFile).toString()); +let allposts = JSON.parse(fs.readFileSync(pathPostsFile).toString()); //serving public assets middleware app.use(express.static('public')) From c509bac248e55d6a200b423817fee1fe6e1cb6b1 Mon Sep 17 00:00:00 2001 From: raj Date: Fri, 27 Jul 2018 20:58:13 +0100 Subject: [PATCH 4/4] Do corrections based on the review --- data/posts.json | 2 +- public/script.js | 4 ++-- router/routes.js | 2 +- server.js | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/data/posts.json b/data/posts.json index 781e661..b45adcd 100644 --- a/data/posts.json +++ b/data/posts.json @@ -1 +1 @@ -[{"blogpost":"first post"},{"blogpost":"hi"},{"blogpost":"post"},{"blogpost":"post"},{"blogpost":"ssffo"},{"blogpost":"one more"}] \ No newline at end of file +[{"blogpost":"first post"},{"blogpost":"second post"},{"blogpost":"third post"}] \ No newline at end of file diff --git a/public/script.js b/public/script.js index a3001bd..985e46c 100644 --- a/public/script.js +++ b/public/script.js @@ -30,7 +30,7 @@ function postBlogposts(url, data) { res.json().then(function(json) { addBlogpostsToPage(json); document.querySelector("form").reset(); - window.location.href = "http://localhost:3000/posts" + window.location.pathname = "/" }); }) .catch(function(err) { @@ -50,7 +50,7 @@ function getBlogposts(url) { }); }) .catch(function (err) { - console.error(err) + console.error("err") }); } diff --git a/router/routes.js b/router/routes.js index b50bfb8..3c4be96 100644 --- a/router/routes.js +++ b/router/routes.js @@ -12,7 +12,7 @@ module.exports = ( app) => { }); app.get("/darshboard/about", (req, res) => { res.render("about.hbs", { - pageTitle: "About page", + pageTitle: "About page", }); }); } \ No newline at end of file diff --git a/server.js b/server.js index 50295e9..6cdea19 100644 --- a/server.js +++ b/server.js @@ -7,13 +7,11 @@ const formidable = require("express-formidable"); const hbs = require('hbs') //variables const port = 3000 -const pathPostsFile = __dirname + "/data/posts.json"; +const pathToPostsFile = __dirname + "/data/posts.json"; //create app const app = express() -//reading posts -let allposts = JSON.parse(fs.readFileSync(pathPostsFile).toString()); //serving public assets middleware app.use(express.static('public')) @@ -25,13 +23,15 @@ app.use(formidable()); // router app.get('/posts', (req, res) => { - res.sendFile(pathPostsFile); + res.sendFile(pathToPostsFile); }) app.post('/create-post', (req, res) => { + //reading posts + let allposts = JSON.parse(fs.readFileSync(pathToPostsFile), 'utf8'); const post = req.fields; allposts.push(post) - fs.writeFileSync(pathPostsFile, JSON.stringify(allposts)); - res.sendFile(pathPostsFile); + fs.writeFileSync(pathToPostsFile, JSON.stringify(allposts)); + res.sendFile(pathToPostsFile); }) require('./router/routes')(app) //routes for handlebars app.listen(port, (req, res) => {