<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=MEAN_Stack_Exercises</id>
	<title>MEAN Stack Exercises - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=MEAN_Stack_Exercises"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=MEAN_Stack_Exercises&amp;action=history"/>
	<updated>2026-05-13T23:41:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=MEAN_Stack_Exercises&amp;diff=67296&amp;oldid=prev</id>
		<title>Lsokolowski: /* Exercise */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=MEAN_Stack_Exercises&amp;diff=67296&amp;oldid=prev"/>
		<updated>2018-05-25T12:20:39Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Exercise&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Angular]]&lt;br /&gt;
[[Category:JavaScript]]&lt;br /&gt;
&lt;br /&gt;
== Angular MEAN stack CRUD Example ==&lt;br /&gt;
* Remember: after each big point below, test your app and check if it still works&lt;br /&gt;
** of course if testing such part will be possible&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1. Command line initial setup&lt;br /&gt;
&lt;br /&gt;
---------- terminal code starts -----------&lt;br /&gt;
sudo npm install -g @angular/cli&lt;br /&gt;
ng new mean-angular5&lt;br /&gt;
cd ./mean-angular5&lt;br /&gt;
ng serve&lt;br /&gt;
CTRL+C&lt;br /&gt;
npm install --save express body-parser morgan serve-favicon&lt;br /&gt;
---------- terminal code ends -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Preparing RESTful API with the compiled Angular 5 front end&lt;br /&gt;
&lt;br /&gt;
2.1 Add bin folder and www file inside bin folder.&lt;br /&gt;
&lt;br /&gt;
mkdir bin&lt;br /&gt;
touch bin/www&lt;br /&gt;
&lt;br /&gt;
---------- www file content starts -----------&lt;br /&gt;
#!/usr/bin/env node &lt;br /&gt;
/**  * Module dependencies.  */ &lt;br /&gt;
var app = require(&amp;#039;../app&amp;#039;); &lt;br /&gt;
var debug = require(&amp;#039;debug&amp;#039;)(&amp;#039;mean-app:server&amp;#039;); &lt;br /&gt;
var http = require(&amp;#039;http&amp;#039;); &lt;br /&gt;
&lt;br /&gt;
/**  * Get port from environment and store in Express.  */ &lt;br /&gt;
var port = normalizePort(process.env.PORT || &amp;#039;3000&amp;#039;); &lt;br /&gt;
app.set(&amp;#039;port&amp;#039;, port); &lt;br /&gt;
&lt;br /&gt;
/**  * Create HTTP server.  */&lt;br /&gt;
var server = http.createServer(app);&lt;br /&gt;
&lt;br /&gt;
/**  * Listen on provided port, on all network interfaces.  */&lt;br /&gt;
server.listen(port); &lt;br /&gt;
server.on(&amp;#039;error&amp;#039;, onError); &lt;br /&gt;
server.on(&amp;#039;listening&amp;#039;, onListening);&lt;br /&gt;
&lt;br /&gt;
/**  * Normalize a port into a number, string, or false.  */ &lt;br /&gt;
function normalizePort(val) {&lt;br /&gt;
	var port = parseInt(val, 10);   &lt;br /&gt;
	if (isNaN(port)) {&lt;br /&gt;
	  // named pipe&lt;br /&gt;
	  return val;&lt;br /&gt;
	}&lt;br /&gt;
	if (port &amp;gt;= 0) {&lt;br /&gt;
	  // port number&lt;br /&gt;
	  return port; &lt;br /&gt;
	}&lt;br /&gt;
	return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**  * Event listener for HTTP server &amp;quot;error&amp;quot; event.  */ &lt;br /&gt;
function onError(error) {&lt;br /&gt;
	if (error.syscall !== &amp;#039;listen&amp;#039;) {     throw error;   }&lt;br /&gt;
	var bind = typeof port === &amp;#039;string&amp;#039; ? &amp;#039;Pipe &amp;#039; + port : &amp;#039;Port &amp;#039; + port;&lt;br /&gt;
&lt;br /&gt;
	// handle specific listen errors with friendly messages&lt;br /&gt;
	switch (error.code) {&lt;br /&gt;
		case &amp;#039;EACCES&amp;#039;:&lt;br /&gt;
			console.error(bind + &amp;#039; requires elevated privileges&amp;#039;);&lt;br /&gt;
			process.exit(1);&lt;br /&gt;
			break;&lt;br /&gt;
		case &amp;#039;EADDRINUSE&amp;#039;:&lt;br /&gt;
			console.error(bind + &amp;#039; is already in use&amp;#039;);&lt;br /&gt;
			process.exit(1);&lt;br /&gt;
			break;&lt;br /&gt;
		default:&lt;br /&gt;
			throw error;   &lt;br /&gt;
	} &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**  * Event listener for HTTP server &amp;quot;listening&amp;quot; event.  */&lt;br /&gt;
function onListening() {   &lt;br /&gt;
	var addr = server.address();&lt;br /&gt;
	var bind = typeof addr === &amp;#039;string&amp;#039; ? &amp;#039;pipe &amp;#039; + addr : &amp;#039;port &amp;#039; + addr.port;&lt;br /&gt;
	debug(&amp;#039;Listening on &amp;#039; + bind);&lt;br /&gt;
}&lt;br /&gt;
---------- www file content ends -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.2. To make the server run from bin/www, open and edit &amp;quot;package.json&amp;quot; then replace &amp;quot;start&amp;quot; value.&lt;br /&gt;
&lt;br /&gt;
---------- change package.json file content start -----------&lt;br /&gt;
...&lt;br /&gt;
&amp;quot;scripts&amp;quot;: {   &amp;quot;ng&amp;quot;: &amp;quot;ng&amp;quot;,   &amp;quot;start&amp;quot;: &amp;quot;ng build &amp;amp;&amp;amp; node ./bin/www&amp;quot;,   &amp;quot;build&amp;quot;: &amp;quot;ng build&amp;quot;,   &amp;quot;test&amp;quot;: &amp;quot;ng test&amp;quot;,   &amp;quot;lint&amp;quot;: &amp;quot;ng lint&amp;quot;,   &amp;quot;e2e&amp;quot;: &amp;quot;ng e2e&amp;quot; },&lt;br /&gt;
...&lt;br /&gt;
---------- change package.json file content end -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.3. Create app.js in the root of project folder.&lt;br /&gt;
&lt;br /&gt;
touch app.js&lt;br /&gt;
&lt;br /&gt;
---------- app.js file content starts -----------&lt;br /&gt;
var express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
var path = require(&amp;#039;path&amp;#039;);&lt;br /&gt;
var favicon = require(&amp;#039;serve-favicon&amp;#039;);&lt;br /&gt;
var logger = require(&amp;#039;morgan&amp;#039;);&lt;br /&gt;
var bodyParser = require(&amp;#039;body-parser&amp;#039;); &lt;br /&gt;
var book = require(&amp;#039;./routes/book&amp;#039;);&lt;br /&gt;
var app = express();&lt;br /&gt;
&lt;br /&gt;
app.use(logger(&amp;#039;dev&amp;#039;));&lt;br /&gt;
app.use(bodyParser.json());&lt;br /&gt;
app.use(bodyParser.urlencoded({&amp;#039;extended&amp;#039;:&amp;#039;false&amp;#039;}));&lt;br /&gt;
app.use(express.static(path.join(__dirname, &amp;#039;dist&amp;#039;)));&lt;br /&gt;
app.use(&amp;#039;/books&amp;#039;, express.static(path.join(__dirname, &amp;#039;dist&amp;#039;)));&lt;br /&gt;
app.use(&amp;#039;/book&amp;#039;, book);&lt;br /&gt;
// catch 404 and forward to error handler&lt;br /&gt;
app.use(function(req, res, next) {   var err = new Error(&amp;#039;Not Found&amp;#039;);   err.status = 404;   next(err); });&lt;br /&gt;
// error handler&lt;br /&gt;
app.use(&lt;br /&gt;
	function(err, req, res, next) {&lt;br /&gt;
		// set locals, only providing error in development&lt;br /&gt;
		res.locals.message = err.message;&lt;br /&gt;
		res.locals.error = req.app.get(&amp;#039;env&amp;#039;) === &amp;#039;development&amp;#039; ? err : {};&lt;br /&gt;
		// render the error page&lt;br /&gt;
		res.status(err.status || 500);   res.render(&amp;#039;error&amp;#039;); &lt;br /&gt;
	}&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
module.exports = app;&lt;br /&gt;
---------- app.js file content ends -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
2.4. Create routes folder then create routes file for the book&lt;br /&gt;
&lt;br /&gt;
mkdir routes &lt;br /&gt;
touch routes/book.js&lt;br /&gt;
&lt;br /&gt;
---------- book.js file content starts -----------&lt;br /&gt;
var express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
var router = express.Router();&lt;br /&gt;
&lt;br /&gt;
/* GET home page. */&lt;br /&gt;
router.get(&amp;#039;/&amp;#039;, function(req, res, next) {   res.send(&amp;#039;Express RESTful API&amp;#039;); });&lt;br /&gt;
&lt;br /&gt;
module.exports = router;&lt;br /&gt;
---------- book.js file content ends -----------&lt;br /&gt;
&lt;br /&gt;
Run the server using this command.&lt;br /&gt;
&lt;br /&gt;
npm start&lt;br /&gt;
&lt;br /&gt;
In te browser&lt;br /&gt;
`http://localhost:3000`.&lt;br /&gt;
and then change the address to&lt;br /&gt;
`http://localhost:3000/book`&lt;br /&gt;
&lt;br /&gt;
Stop the server&lt;br /&gt;
CTRL+C&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
3. Install and Configure Mongoose.js&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
npm install --save mongoose bluebird&lt;br /&gt;
&lt;br /&gt;
Edit `app.js` then add this lines after another variable line&lt;br /&gt;
---------- change app.js file content end -----------&lt;br /&gt;
var mongoose = require(&amp;#039;mongoose&amp;#039;);&lt;br /&gt;
mongoose.Promise = require(&amp;#039;bluebird&amp;#039;);&lt;br /&gt;
mongoose.connect(&lt;br /&gt;
	&amp;#039;mongodb://localhost/mean-angular5&amp;#039;, {&lt;br /&gt;
		useMongoClient: true, promiseLibrary: require(&amp;#039;bluebird&amp;#039;)&lt;br /&gt;
		}&lt;br /&gt;
	).then(() =&amp;gt;  console.log(&amp;#039;connection succesful&amp;#039;))&lt;br /&gt;
	.catch((err) =&amp;gt; console.error(err));&lt;br /&gt;
---------- change app.js file content end -----------&lt;br /&gt;
&lt;br /&gt;
Run MongoDB server on different terminal tab or command line or run from the service&lt;br /&gt;
&lt;br /&gt;
sudo service mongod start &lt;br /&gt;
# on windows: mongod&lt;br /&gt;
&lt;br /&gt;
npm start&lt;br /&gt;
# connection succesful&lt;br /&gt;
&lt;br /&gt;
Built-in Mongoose Promise library is depricated, so we add `bluebird` modules and register it as Mongoose Promise library&lt;br /&gt;
&lt;br /&gt;
(node:42758) DeprecationWarning: Mongoose: mpromise (mongoose&amp;#039;s default promise library) is deprecated, plug in your own promise library instead: http://mongoosejs.com/docs/promises.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
4. Create Mongoose.js Model&lt;br /&gt;
&lt;br /&gt;
mkdir models&lt;br /&gt;
touch models/Book.js&lt;br /&gt;
&lt;br /&gt;
---------- Book.js file content starts -----------&lt;br /&gt;
var mongoose = require(&amp;#039;mongoose&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
var BookSchema = new mongoose.Schema({&lt;br /&gt;
	isbn: String,&lt;br /&gt;
	title: String,&lt;br /&gt;
	author: String,&lt;br /&gt;
	description: String,&lt;br /&gt;
	published_year: String,&lt;br /&gt;
	publisher: String,&lt;br /&gt;
	updated_date: { &lt;br /&gt;
		type: Date, &lt;br /&gt;
		default: Date.now&lt;br /&gt;
		}, &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
module.exports = mongoose.model(&amp;#039;Book&amp;#039;, BookSchema);&lt;br /&gt;
---------- Book.js file content ends -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5. Create Routes for Accessing Book Data via Restful API&lt;br /&gt;
&lt;br /&gt;
---------- Replace routes/book.js file content start -----------&lt;br /&gt;
var express = require(&amp;#039;express&amp;#039;);&lt;br /&gt;
var router = express.Router();&lt;br /&gt;
var mongoose = require(&amp;#039;mongoose&amp;#039;);&lt;br /&gt;
var Book = require(&amp;#039;../models/Book.js&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
/* GET ALL BOOKS */&lt;br /&gt;
router.get(&amp;#039;/&amp;#039;, function(req, res, next) {&lt;br /&gt;
	Book.find(function (err, products) {&lt;br /&gt;
			if (err) return next(err);&lt;br /&gt;
			res.json(products);&lt;br /&gt;
		}); &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* GET SINGLE BOOK BY ID */&lt;br /&gt;
router.get(&amp;#039;/:id&amp;#039;, function(req, res, next) {&lt;br /&gt;
	Book.findById(req.params.id, function (err, post) {&lt;br /&gt;
		if (err) return next(err);&lt;br /&gt;
		res.json(post);&lt;br /&gt;
	}); &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* SAVE BOOK */&lt;br /&gt;
router.post(&amp;#039;/&amp;#039;, function(req, res, next) {&lt;br /&gt;
	Book.create(req.body, function (err, post) {&lt;br /&gt;
		if (err) return next(err);&lt;br /&gt;
		res.json(post);&lt;br /&gt;
	});&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* UPDATE BOOK */&lt;br /&gt;
router.put(&amp;#039;/:id&amp;#039;, function(req, res, next) {&lt;br /&gt;
	Book.findByIdAndUpdate(req.params.id, req.body, function (err, post) {&lt;br /&gt;
		if (err) return next(err);&lt;br /&gt;
		res.json(post);&lt;br /&gt;
	}); &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/* DELETE BOOK */&lt;br /&gt;
router.delete(&amp;#039;/:id&amp;#039;, function(req, res, next) {&lt;br /&gt;
	Book.findByIdAndRemove(req.params.id, req.body, function (err, post) {&lt;br /&gt;
		if (err) return next(err);&lt;br /&gt;
		res.json(post);&lt;br /&gt;
	}); &lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
module.exports = router;&lt;br /&gt;
---------- Replace routes/book.js file content end -----------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
5.1. Populating db&lt;br /&gt;
&lt;br /&gt;
npm start&lt;br /&gt;
&lt;br /&gt;
# Open the other terminal or command line to test the Restful API by type this command:&lt;br /&gt;
&lt;br /&gt;
curl -i -H &amp;quot;Accept: application/json&amp;quot; localhost:3000/book&lt;br /&gt;
&lt;br /&gt;
# We expect something similar to this:&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 2 ETag: W/&amp;quot;2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w&amp;quot; Date: Fri, 10 Nov 2017 23:53:52 GMT Connection: keep-alive&lt;br /&gt;
&lt;br /&gt;
# Populate Book collection with initial data that sent from RESTful API&lt;br /&gt;
&lt;br /&gt;
curl -i -X POST -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;#039;{ &amp;quot;isbn&amp;quot;:&amp;quot;123442123, 97885654453443&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Learn how to build modern web application with MEAN stack&amp;quot;,&amp;quot;author&amp;quot;: &amp;quot;Didin J.&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;The comprehensive step by step tutorial on how to build MEAN (MongoDB, Express.js, Angular 5 and Node.js) stack web application from scratch&amp;quot;,&amp;quot;published_year&amp;quot;:&amp;quot;2017&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;Djamware.com&amp;quot; }&amp;#039; localhost:3000/book&lt;br /&gt;
&lt;br /&gt;
# Response should look like this&lt;br /&gt;
&lt;br /&gt;
HTTP/1.1 200 OK X-Powered-By: Express Content-Type: application/json; charset=utf-8 Content-Length: 415 ETag: W/&amp;quot;19f-SB/dEQyffaTjobOBJbvmwCn7WJA&amp;quot; Date: Fri, 10 Nov 2017 23:58:11 GMT Connection: keep-alive {&amp;quot;__v&amp;quot;:0,&amp;quot;isbn&amp;quot;:&amp;quot;123442123, 97885654453443&amp;quot;,&amp;quot;title&amp;quot;:&amp;quot;Learn how to build modern web application with MEAN stack&amp;quot;,&amp;quot;author&amp;quot;:&amp;quot;Didin J.&amp;quot;,&amp;quot;description&amp;quot;:&amp;quot;The comprehensive step by step tutorial on how to build MEAN (MongoDB, Express.js, Angular 5 and Node.js) stack web application from scratch&amp;quot;,&amp;quot;published_year&amp;quot;:&amp;quot;2017&amp;quot;,&amp;quot;publisher&amp;quot;:&amp;quot;Djamware.com&amp;quot;,&amp;quot;_id&amp;quot;:&amp;quot;5a063d123cf0792af12ce45d&amp;quot;,&amp;quot;updated_date&amp;quot;:&amp;quot;2017-11-10T23:58:10.971Z&amp;quot;}MacBook-Pro:mean-angular5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Create Angular 5 Component for Displaying Book List&lt;br /&gt;
&lt;br /&gt;
ng g component book&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.1.&lt;br /&gt;
// ------- Edit `src/app/app.module.ts` --------&lt;br /&gt;
&lt;br /&gt;
import { FormsModule } from &amp;#039;@angular/forms&amp;#039;; import { HttpClientModule } from &amp;#039;@angular/common/http&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Add it to `@NgModule` imports after `BrowserModule`.&lt;br /&gt;
&lt;br /&gt;
imports: [   BrowserModule,   FormsModule,   HttpClientModule ],&lt;br /&gt;
&lt;br /&gt;
// ---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.2.&lt;br /&gt;
// ------- Edit `src/app/book/book.component.ts` --------&lt;br /&gt;
&lt;br /&gt;
import { HttpClient } from &amp;#039;@angular/common/http&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Inject `HttpClient` to the constructor.&lt;br /&gt;
&lt;br /&gt;
constructor(private http: HttpClient) { }&lt;br /&gt;
&lt;br /&gt;
// Add array variable for holding books data before the constructor.&lt;br /&gt;
&lt;br /&gt;
books: any;&lt;br /&gt;
&lt;br /&gt;
// Add a few lines of codes for getting a list of book data from RESTful API inside `ngOnInit` function.&lt;br /&gt;
&lt;br /&gt;
ngOnInit() {   this.http.get(&amp;#039;/book&amp;#039;).subscribe(data =&amp;gt; {     this.books = data;   }); }&lt;br /&gt;
// ---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.3.&lt;br /&gt;
------- Edit and replace `src/app/book/book.component.html` --------&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Book List&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;table class=&amp;quot;table&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;thead&amp;gt;&lt;br /&gt;
			&amp;lt;tr&amp;gt;&lt;br /&gt;
				&amp;lt;th&amp;gt;Title&amp;lt;/th&amp;gt;&lt;br /&gt;
				&amp;lt;th&amp;gt;Author&amp;lt;/th&amp;gt;&lt;br /&gt;
				&amp;lt;th&amp;gt;Action&amp;lt;/th&amp;gt;&lt;br /&gt;
			&amp;lt;/tr&amp;gt;&lt;br /&gt;
		&amp;lt;/thead&amp;gt;&lt;br /&gt;
		&amp;lt;tbody&amp;gt;&lt;br /&gt;
			&amp;lt;tr *ngFor=&amp;quot;let book of books&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;td&amp;gt;{{ book.title }}&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;td&amp;gt;{{ book.author }}&amp;lt;/td&amp;gt;&lt;br /&gt;
				&amp;lt;td&amp;gt;Show Detail&amp;lt;/td&amp;gt;&lt;br /&gt;
			&amp;lt;/tr&amp;gt;&lt;br /&gt;
		&amp;lt;/tbody&amp;gt;&lt;br /&gt;
	&amp;lt;/table&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6.3.1.&lt;br /&gt;
------- Edit `src/index.html` --------&lt;br /&gt;
&amp;lt;!doctype html&amp;gt;&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;head&amp;gt;&lt;br /&gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;title&amp;gt;MeanAngular5&amp;lt;/title&amp;gt;&lt;br /&gt;
	&amp;lt;base href=&amp;quot;/&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;icon&amp;quot; type=&amp;quot;image/x-icon&amp;quot; href=&amp;quot;favicon.ico&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Latest compiled and minified CSS --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css&amp;quot; integrity=&amp;quot;sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;!-- Optional theme --&amp;gt;&lt;br /&gt;
	&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css&amp;quot; integrity=&amp;quot;sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;/head&amp;gt;&lt;br /&gt;
	&amp;lt;body&amp;gt;&lt;br /&gt;
		&amp;lt;app-root&amp;gt;&amp;lt;/app-root&amp;gt;&lt;br /&gt;
&lt;br /&gt;
		&amp;lt;!-- Latest compiled and minified JavaScript --&amp;gt;&lt;br /&gt;
		&amp;lt;script src=&amp;quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js&amp;quot; integrity=&amp;quot;sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa&amp;quot; crossorigin=&amp;quot;anonymous&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
	&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7. Create Angular 5 Routes to Book Component&lt;br /&gt;
&lt;br /&gt;
------- Edit `src/app/app.module.ts` --------&lt;br /&gt;
import { RouterModule, Routes } from &amp;#039;@angular/router&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
// Create constant router for routing to book component before `@NgModule`.&lt;br /&gt;
&lt;br /&gt;
const appRoutes: Routes = [&lt;br /&gt;
	{&lt;br /&gt;
		path: &amp;#039;books&amp;#039;,&lt;br /&gt;
		component: BookComponent,&lt;br /&gt;
		data: { title: &amp;#039;Book List&amp;#039; }   &lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		path: &amp;#039;&amp;#039;,&lt;br /&gt;
		redirectTo: &amp;#039;/books&amp;#039;,&lt;br /&gt;
		pathMatch: &amp;#039;full&amp;#039;&lt;br /&gt;
	} &lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
// In @NgModule imports, section adds ROUTES constant, so imports section will be like this.&lt;br /&gt;
&lt;br /&gt;
imports: [&lt;br /&gt;
	BrowserModule,&lt;br /&gt;
	HttpClientModule,&lt;br /&gt;
	RouterModule.forRoot(appRoutes, { enableTracing: true })// &amp;lt;-- debugging purposes only&lt;br /&gt;
],&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
7.1. Activate routes&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/app.component.html` --------&lt;br /&gt;
&amp;lt;router-outlet&amp;gt;&amp;lt;/router-outlet&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
npm start&lt;br /&gt;
&lt;br /&gt;
In the browser&lt;br /&gt;
`http://localhost:3000`&lt;br /&gt;
`http://localhost:3000/books`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8. Create Angular 5 Component for Displaying Book Detail&lt;br /&gt;
&lt;br /&gt;
ng g component book-detail&lt;br /&gt;
&lt;br /&gt;
------- Add route to `src/app/app.module.ts` -------&lt;br /&gt;
const appRoutes: Routes = [&lt;br /&gt;
	{&lt;br /&gt;
		path: &amp;#039;books&amp;#039;,&lt;br /&gt;
		component: BookComponent,&lt;br /&gt;
		data: { title: &amp;#039;Book List&amp;#039; }   &lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		path: &amp;#039;book-details/:id&amp;#039;,&lt;br /&gt;
		component: BookDetailComponent,&lt;br /&gt;
		data: { title: &amp;#039;Book Details&amp;#039; }&lt;br /&gt;
	},&lt;br /&gt;
	{&lt;br /&gt;
		path: &amp;#039;&amp;#039;,&lt;br /&gt;
		redirectTo: &amp;#039;/books&amp;#039;,&lt;br /&gt;
		pathMatch: &amp;#039;full&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
];&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
8.1. Update Detail component ts&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book-detail/book-detail.component.ts` --------&lt;br /&gt;
import { Component, OnInit, ViewEncapsulation } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
import { HttpClient } from &amp;#039;@angular/common/http&amp;#039;;&lt;br /&gt;
import { ActivatedRoute } from &amp;#039;@angular/router&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Component({&lt;br /&gt;
	selector: &amp;#039;app-book-detail&amp;#039;,&lt;br /&gt;
	templateUrl: &amp;#039;./book-detail.component.html&amp;#039;,&lt;br /&gt;
	styleUrls: [&amp;#039;./book-detail.component.css&amp;#039;],&lt;br /&gt;
	encapsulation: ViewEncapsulation.None&lt;br /&gt;
})&lt;br /&gt;
export class BookDetailComponent implements OnInit {&lt;br /&gt;
	book = {};&lt;br /&gt;
	constructor(private route: ActivatedRoute, private http: HttpClient) { }&lt;br /&gt;
&lt;br /&gt;
	ngOnInit() {     this.getBookDetail(this.route.snapshot.params[&amp;#039;id&amp;#039;]);   }&lt;br /&gt;
&lt;br /&gt;
	getBookDetail(id) {&lt;br /&gt;
		this.http.get(&amp;#039;/book/&amp;#039;+id).subscribe(&lt;br /&gt;
			data =&amp;gt; {&lt;br /&gt;
				this.book = data; &lt;br /&gt;
			});&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
8.2. Update Detail component html&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book-detail/book-detail.component.html` --------&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;{{ book.title }}&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;dl class=&amp;quot;list&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;dt&amp;gt;ISBN&amp;lt;/dt&amp;gt;&lt;br /&gt;
		&amp;lt;dd&amp;gt;{{ book.isbn }}&amp;lt;/dd&amp;gt;&lt;br /&gt;
		&amp;lt;dt&amp;gt;Author&amp;lt;/dt&amp;gt;&lt;br /&gt;
		&amp;lt;dd&amp;gt;{{ book.author }}&amp;lt;/dd&amp;gt;&lt;br /&gt;
		&amp;lt;dt&amp;gt;Publisher&amp;lt;/dt&amp;gt;&lt;br /&gt;
		&amp;lt;dd&amp;gt;{{ book.publisher }}&amp;lt;/dd&amp;gt;&lt;br /&gt;
		&amp;lt;dt&amp;gt;Price&amp;lt;/dt&amp;gt;&lt;br /&gt;
		&amp;lt;dd&amp;gt;{{ book.price }}&amp;lt;/dd&amp;gt;&lt;br /&gt;
		&amp;lt;dt&amp;gt;Update Date&amp;lt;/dt&amp;gt;&lt;br /&gt;
		&amp;lt;dd&amp;gt;{{ book.updated_at }}&amp;lt;/dd&amp;gt;&lt;br /&gt;
	&amp;lt;/dl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9. Create Angular 5 Component for Add New Book&lt;br /&gt;
&lt;br /&gt;
ng g component book-create&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9.1. Update router&lt;br /&gt;
&lt;br /&gt;
------- Add route to `src/app/app.module.ts` -------&lt;br /&gt;
const appRoutes: Routes = [&lt;br /&gt;
	{     path: &amp;#039;books&amp;#039;,     component: BookComponent,     data: { title: &amp;#039;Book List&amp;#039; }   },   &lt;br /&gt;
	{     path: &amp;#039;book-details/:id&amp;#039;,     component: BookDetailComponent,     data: { title: &amp;#039;Book Details&amp;#039; }   },&lt;br /&gt;
	{     path: &amp;#039;book-create&amp;#039;,     component: BookCreateComponent,     data: { title: &amp;#039;Create Book&amp;#039; }   },&lt;br /&gt;
	{ path: &amp;#039;&amp;#039;,     redirectTo: &amp;#039;/books&amp;#039;,     pathMatch: &amp;#039;full&amp;#039;   }&lt;br /&gt;
];&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9.2. Add &amp;#039;book-create&amp;#039; link&lt;br /&gt;
&lt;br /&gt;
------- Edit `src/app/book/book.component.html` -------&lt;br /&gt;
&amp;lt;h1&amp;gt;Book List&lt;br /&gt;
	&amp;lt;a [routerLink]=&amp;quot;[&amp;#039;/book-create&amp;#039;]&amp;quot; class=&amp;quot;btn btn-default btn-lg&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;span class=&amp;quot;glyphicon glyphicon-plus&amp;quot; aria-hidden=&amp;quot;true&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
	&amp;lt;/a&amp;gt;&lt;br /&gt;
&amp;lt;/h1&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9.3. Update &amp;#039;book-create&amp;#039; component ts&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book/book-create.component.ts` -------&lt;br /&gt;
import { Component, OnInit, ViewEncapsulation } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
import { Router } from &amp;#039;@angular/router&amp;#039;;&lt;br /&gt;
import { HttpClient } from &amp;#039;@angular/common/http&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Component({&lt;br /&gt;
	selector: &amp;#039;app-book-create&amp;#039;,&lt;br /&gt;
	templateUrl: &amp;#039;./book-create.component.html&amp;#039;,&lt;br /&gt;
	styleUrls: [&amp;#039;./book-create.component.css&amp;#039;],&lt;br /&gt;
	encapsulation: ViewEncapsulation.None &lt;br /&gt;
})&lt;br /&gt;
export class BookCreateComponent implements OnInit {&lt;br /&gt;
	book = {};&lt;br /&gt;
	constructor(private http: HttpClient, private router: Router) { }&lt;br /&gt;
&lt;br /&gt;
	ngOnInit() {   }&lt;br /&gt;
&lt;br /&gt;
	saveBook() {&lt;br /&gt;
		this.http.post(&amp;#039;/book&amp;#039;, this.book).subscribe(&lt;br /&gt;
			res =&amp;gt; {&lt;br /&gt;
				let id = res[&amp;#039;_id&amp;#039;];&lt;br /&gt;
				this.router.navigate([&amp;#039;/book-details&amp;#039;, id]);&lt;br /&gt;
			},&lt;br /&gt;
			(err) =&amp;gt; {&lt;br /&gt;
				console.log(err);&lt;br /&gt;
			}&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
9.4. Update &amp;#039;book-create&amp;#039; component html&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book-create/book-create.component.html` ------&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Add New Book&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;form (ngSubmit)=&amp;quot;saveBook()&amp;quot; #bookForm=&amp;quot;ngForm&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;ISBN&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.isbn&amp;quot; name=&amp;quot;isbn&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Title&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.title&amp;quot; name=&amp;quot;title&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Author&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.author&amp;quot; name=&amp;quot;author&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Published Year&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.published_year&amp;quot; name=&amp;quot;published_year&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Publisher&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.publisher&amp;quot; name=&amp;quot;publisher&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;button type=&amp;quot;submit&amp;quot; class=&amp;quot;btn btn-success&amp;quot; [disabled]=&amp;quot;!bookForm.form.valid&amp;quot;&amp;gt;Save&amp;lt;/button&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10. Create Angular 5 Component for Edit Book&lt;br /&gt;
&lt;br /&gt;
ng g component book-edit&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10.1. Update router&lt;br /&gt;
&lt;br /&gt;
------- Add route to `src/app/app.module.ts` -------&lt;br /&gt;
const appRoutes: Routes = [&lt;br /&gt;
	{   path: &amp;#039;books&amp;#039;,     component: BookComponent,     data: { title: &amp;#039;Book List&amp;#039; }   },&lt;br /&gt;
	{   path: &amp;#039;book-details/:id&amp;#039;,     component: BookDetailComponent,     data: { title: &amp;#039;Book Details&amp;#039; }   },&lt;br /&gt;
	{   path: &amp;#039;book-create&amp;#039;,     component: BookCreateComponent,     data: { title: &amp;#039;Create Book&amp;#039; }   },&lt;br /&gt;
	{   path: &amp;#039;book-edit/:id&amp;#039;,     component: BookEditComponent,     data: { title: &amp;#039;Edit Book&amp;#039; }   },&lt;br /&gt;
	{	path: &amp;#039;&amp;#039;,     redirectTo: &amp;#039;/books&amp;#039;,     pathMatch: &amp;#039;full&amp;#039;   }&lt;br /&gt;
];&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10.2. Update book-details component html&lt;br /&gt;
&lt;br /&gt;
------- Edit `src/app/book-details/book-details.component.html` ---------&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;a [routerLink]=&amp;quot;[&amp;#039;/book-edit&amp;#039;, book._id]&amp;quot; class=&amp;quot;btn btn-success&amp;quot;&amp;gt;EDIT&amp;lt;/a&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10.3. Update book-edit component ts&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book-edit/book-edit.component.ts` --------&lt;br /&gt;
import { Component, OnInit, ViewEncapsulation } from &amp;#039;@angular/core&amp;#039;;&lt;br /&gt;
import { ActivatedRoute, Router } from &amp;#039;@angular/router&amp;#039;;&lt;br /&gt;
import { HttpClient } from &amp;#039;@angular/common/http&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
@Component({&lt;br /&gt;
	selector: &amp;#039;app-book-edit&amp;#039;,&lt;br /&gt;
	templateUrl: &amp;#039;./book-edit.component.html&amp;#039;,&lt;br /&gt;
	styleUrls: [&amp;#039;./book-edit.component.css&amp;#039;],&lt;br /&gt;
	encapsulation: ViewEncapsulation.None&lt;br /&gt;
})&lt;br /&gt;
export class BookEditComponent implements OnInit {&lt;br /&gt;
	book = {};&lt;br /&gt;
	constructor(private http: HttpClient, private router: Router, private route: ActivatedRoute) { }&lt;br /&gt;
	&lt;br /&gt;
	ngOnInit() { this.getBook(this.route.snapshot.params[&amp;#039;id&amp;#039;]); }&lt;br /&gt;
&lt;br /&gt;
	getBook(id) {     this.http.get(&amp;#039;/book/&amp;#039;+id).subscribe(data =&amp;gt; {       this.book = data;     });   }&lt;br /&gt;
&lt;br /&gt;
	updateBook(id, data) {&lt;br /&gt;
		this.http.put(&amp;#039;/book/&amp;#039;+id, data).subscribe(&lt;br /&gt;
			res =&amp;gt; { let id = res[&amp;#039;_id&amp;#039;]; this.router.navigate([&amp;#039;/book-details&amp;#039;, id]); },&lt;br /&gt;
			(err) =&amp;gt; { console.log(err); }&lt;br /&gt;
		);&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
10.4. Update book-edit component html&lt;br /&gt;
&lt;br /&gt;
------- Edit and replace `src/app/book-edit/book-edit.component.html` --------&lt;br /&gt;
&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;h1&amp;gt;Edit Book&amp;lt;/h1&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;div class=&amp;quot;col-md-6&amp;quot;&amp;gt;&lt;br /&gt;
			&amp;lt;form (ngSubmit)=&amp;quot;updateBook(book._id)&amp;quot; #bookForm=&amp;quot;ngForm&amp;quot;&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;ISBN&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.isbn&amp;quot; name=&amp;quot;isbn&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Title&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.title&amp;quot; name=&amp;quot;title&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Author&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.author&amp;quot; name=&amp;quot;author&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Published Year&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;number&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.published_year&amp;quot; name=&amp;quot;published_year&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;label for=&amp;quot;name&amp;quot;&amp;gt;Publisher&amp;lt;/label&amp;gt;&lt;br /&gt;
					&amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;form-control&amp;quot; [(ngModel)]=&amp;quot;book.publisher&amp;quot; name=&amp;quot;publisher&amp;quot; required&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
				&amp;lt;div class=&amp;quot;form-group&amp;quot;&amp;gt;&lt;br /&gt;
					&amp;lt;button type=&amp;quot;submit&amp;quot; class=&amp;quot;btn btn-success&amp;quot; [disabled]=&amp;quot;!bookForm.form.valid&amp;quot;&amp;gt;Update&amp;lt;/button&amp;gt;&lt;br /&gt;
				&amp;lt;/div&amp;gt;&lt;br /&gt;
			&amp;lt;/form&amp;gt;&lt;br /&gt;
		&amp;lt;/div&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
---------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
11. Create Delete Function on Book-Detail Component&lt;br /&gt;
&lt;br /&gt;
// Open and edit `src/app/book-detail/book-detail`.component.ts then add `Router` module to `@angular/router`.&lt;br /&gt;
import { ActivatedRoute, Router } from &amp;#039;@angular/router&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Inject `Router` in the constructor params.&lt;br /&gt;
constructor(private router: Router, private route: ActivatedRoute, private http: HttpClient) { }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Add this function for delete book.&lt;br /&gt;
------------- code starts -------------&lt;br /&gt;
deleteBook(id) {   this.http.delete(&amp;#039;/book/&amp;#039;+id)     .subscribe(res =&amp;gt; {         this.router.navigate([&amp;#039;/books&amp;#039;]);       }, (err) =&amp;gt; {         console.log(err);       }     ); }&lt;br /&gt;
------------- code ends -------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Add delete button in `src/app/book-detail/book-detail.component.html` on the right of Edit routerLink.&lt;br /&gt;
------------- code starts -------------&lt;br /&gt;
&amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;div class=&amp;quot;col-md-12&amp;quot;&amp;gt;&lt;br /&gt;
		&amp;lt;a [routerLink]=&amp;quot;[&amp;#039;/book-edit&amp;#039;, book._id]&amp;quot; class=&amp;quot;btn btn-success&amp;quot;&amp;gt;EDIT&amp;lt;/a&amp;gt;&lt;br /&gt;
		&amp;lt;button class=&amp;quot;btn btn-danger&amp;quot; type=&amp;quot;button&amp;quot; (click)=&amp;quot;deleteBook(book._id)&amp;quot;&amp;gt;DELETE&amp;lt;/button&amp;gt;&lt;br /&gt;
	&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
------------- code ends -------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
12. Run and test your CRUD app (-:&lt;br /&gt;
&lt;br /&gt;
npm start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercise ==&lt;br /&gt;
# Add link &amp;#039;Show Details&amp;#039; to list of books&lt;br /&gt;
# Make your jewel app working as restful CRUD mean stack (-:&lt;br /&gt;
&amp;lt;!-- Solution to 1&lt;br /&gt;
&amp;lt;tbody&amp;gt;&lt;br /&gt;
  &amp;lt;tr *ngFor=&amp;quot;let book of books&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{{ book.title }}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;{{ book.author }}&amp;lt;/td&amp;gt;&lt;br /&gt;
    &amp;lt;td&amp;gt;&amp;lt;a [routerLink]=&amp;quot;[&amp;#039;/book-details&amp;#039;, book._id]&amp;quot;&amp;gt;Show Detail&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;
  &amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/tbody&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lsokolowski</name></author>
	</entry>
</feed>