<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Angular._Building_CRUD_Web_Application</id>
	<title>Angular. Building CRUD Web Application - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Angular._Building_CRUD_Web_Application"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Angular._Building_CRUD_Web_Application&amp;action=history"/>
	<updated>2026-08-30T08:02:20Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Angular._Building_CRUD_Web_Application&amp;diff=297360&amp;oldid=prev</id>
		<title>Joan: /* Proves dels endpoints de la REST API */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Angular._Building_CRUD_Web_Application&amp;diff=297360&amp;oldid=prev"/>
		<updated>2021-05-01T21:44:58Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Proves dels endpoints de la REST API&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ca&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Versió més antiga&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revisió del 21:44, 1 maig 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l75&quot; &gt;Línia 75:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Línia 75:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Per afegir un nou producte (fem servir POST):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Per afegir un nou producte (fem servir POST):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$ curl -i -H &amp;quot;Accept: application/json&amp;quot; &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;lX &lt;/del&gt;POST -H &amp;quot;Content-Type: application/json&amp;quot; -d '{ &amp;quot;prod_name&amp;quot;:&amp;quot;GBA&amp;quot;,&amp;quot;prod_desc&amp;quot;:&amp;quot;Game Boy Advance 1994&amp;quot;,&amp;quot;prod_price&amp;quot;: 88 }' localhost:3000/products&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;$ curl -i -H &amp;quot;Accept: application/json&amp;quot; &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;-X &lt;/ins&gt;POST -H &amp;quot;Content-Type: application/json&amp;quot; -d '{ &amp;quot;prod_name&amp;quot;:&amp;quot;GBA&amp;quot;,&amp;quot;prod_desc&amp;quot;:&amp;quot;Game Boy Advance 1994&amp;quot;,&amp;quot;prod_price&amp;quot;: 88 }' localhost:3000/products&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Per visualitzar tots els productes:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Per visualitzar tots els productes:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Angular._Building_CRUD_Web_Application&amp;diff=258412&amp;oldid=prev</id>
		<title>Joan: /* Possibles errors/problemes que us podeu trobar */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Angular._Building_CRUD_Web_Application&amp;diff=258412&amp;oldid=prev"/>
		<updated>2019-04-30T17:31:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Possibles errors/problemes que us podeu trobar&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Introducció=&lt;br /&gt;
[[Fitxer:Article-201018060704.png|thumbnail]]&lt;br /&gt;
Crearem una aplicació web amb el framework de Angular 7. És una aplicació que mostra la funcionalitat bàsica CRUD (''create, read, update, delete'') sobre una llista de productes que tindrem implementada en una base de dades MongoDB.&lt;br /&gt;
&lt;br /&gt;
El més interessant d'aquesta pràctica, a part d'implemntar un exemple concret de Angular, és que crea i utilitza una REST API d'una forma ràpida i eficient utilitzant també les tecnologies més actuals.&lt;br /&gt;
&lt;br /&gt;
De cara al projecte de síntesi que realitzaràs en les properes setmanes seria una bona idea implementar també una REST API, i en aquesta pràctica en tens un bon exemple.&lt;br /&gt;
&lt;br /&gt;
És important per aquesta pràctica tenir actualitzat a les últimes versions el Node, Angular i npm.&lt;br /&gt;
&lt;br /&gt;
=Referències=&lt;br /&gt;
Seguirem aquests dos tutorials:&lt;br /&gt;
&lt;br /&gt;
How to Create REST API Easily using Node.js, Express.js, Mongoose.js and MongoDB&lt;br /&gt;
*https://www.djamware.com/post/58a91cdf80aca748640ce353/how-to-create-rest-api-easily-using-nodejs-expressjs-mongoosejs-and-mongodb&lt;br /&gt;
&lt;br /&gt;
Angular 7 Tutorial: Building CRUD Web Application&lt;br /&gt;
*https://www.djamware.com/post/5bca67d780aca7466989441f/angular-7-tutorial-building-crud-web-application&lt;br /&gt;
&lt;br /&gt;
El primer tutorial crea la REST API per accedir a la BD de MongoDB des de http. Fins que no hagis finalitzat aquest tutorial no podràs continuar amb el següent, que és pròpiament el tutorial de Angular.&lt;br /&gt;
&lt;br /&gt;
Per tal de poder seguir els dos tutorials és important tenir ben actualitzats el ''node'', ''npm'' i el ''angular''. Per exemple, per actualitzar ha funcionat en Ubuntu 18.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo apt-get remove nodejs ^node-* nodejs-*&lt;br /&gt;
sudo apt-get autoremove&lt;br /&gt;
sudo apt-get clean&lt;br /&gt;
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -&lt;br /&gt;
sudo apt-get install nodejs&lt;br /&gt;
curl https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Instal·lar la REST API (Node.js, Express.js, Mongoose.js, MongoDB)=&lt;br /&gt;
*https://www.djamware.com/post/58a91cdf80aca748640ce353/how-to-create-rest-api-easily-using-nodejs-expressjs-mongoosejs-and-mongodb&lt;br /&gt;
&lt;br /&gt;
Aquesta REST API utilitza diferents tecnologies:&lt;br /&gt;
&lt;br /&gt;
'''Què és mongoose?'''&lt;br /&gt;
Elegant mongodb object modeling for node.js. Es fa servir mongoose per tal de connectar-nos a MongoDB.&lt;br /&gt;
&lt;br /&gt;
'''Què és Express.js?'''&lt;br /&gt;
&lt;br /&gt;
Fast, unopinionated, minimalist web framework for Node.js. Express is a minimal and flexible Node.js web application framework that provides a robust set of features for web and mobile applications.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Proves dels endpoints de la REST API==&lt;br /&gt;
*https://www.djamware.com/post/5bca67d780aca7466989441f/angular-7-tutorial-building-crud-web-application&lt;br /&gt;
&lt;br /&gt;
La Rest Api està basada en teconologia Node.&lt;br /&gt;
&lt;br /&gt;
Tria la carpeta on instal·laràs la Rest Api. Pot ser una carpeta paral·lela a la carpeta on instal·laràs el projecte Angular. Per exemple, per al professor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ cd ~/M06_WEC_1819/PHP/UF2/node-rest-api&lt;br /&gt;
$ npm start&lt;br /&gt;
&lt;br /&gt;
&amp;gt; node-rest-api@0.0.0 start /home/joan/M06_WEC_1819/PHP/UF2/node-rest-api&lt;br /&gt;
&amp;gt; node ./bin/www&lt;br /&gt;
&lt;br /&gt;
connection succesful&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Amb '''npm start''' arrenquem el nostre API REST pel port 3000. Hem de veure que la connexió és ''successful'', que vol dir que tenim una bona connexió al MongoDB a través de ''Mongoose''.&lt;br /&gt;
&lt;br /&gt;
Quan fem '''npm start''' el que estem fent és executar el script que hi ha definit en el fitxer ''package.json'':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  &amp;quot;scripts&amp;quot;: {&lt;br /&gt;
    &amp;quot;start&amp;quot;: &amp;quot;node ./bin/www&amp;quot;&lt;br /&gt;
  },&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Si ens fixem, el script ''./bin/www'' és un servidor web fet amb node que escolta pel port 3000.&lt;br /&gt;
 &lt;br /&gt;
Podem comprovar que funciona la REST API, amb la url en el navegador:&lt;br /&gt;
*localhost:3000&lt;br /&gt;
&lt;br /&gt;
Per provar els endpopints  de la Rest API farem servir '''curl''' des de la consola.&lt;br /&gt;
&lt;br /&gt;
Per afegir un nou producte (fem servir POST):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -i -H &amp;quot;Accept: application/json&amp;quot; lX POST -H &amp;quot;Content-Type: application/json&amp;quot; -d '{ &amp;quot;prod_name&amp;quot;:&amp;quot;GBA&amp;quot;,&amp;quot;prod_desc&amp;quot;:&amp;quot;Game Boy Advance 1994&amp;quot;,&amp;quot;prod_price&amp;quot;: 88 }' localhost:3000/products&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per visualitzar tots els productes:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -i -H &amp;quot;Accept: application/json&amp;quot; localhost:3000/products&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per visualitzar el producte amb id=5cbf295b75e0a91fd03740db:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -i -H &amp;quot;Accept: application/json&amp;quot; localhost:3000/products/5cbf295b75e0a91fd03740db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Per esborrar el producte amb id=5cbf295b75e0a91fd03740db:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -i -X DELETE localhost:3000/products/5cbf295b75e0a91fd03740db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Des del navegador també podem llistar els productes:&lt;br /&gt;
*localhost:3000/products&lt;br /&gt;
*localhost:3000/products/5cbf295b75e0a91fd03740db&lt;br /&gt;
&lt;br /&gt;
Quan provem la REST API podem visualitzar la info (mínima) que ens proporciona la consola que tenim oberta. També és una manera de comprovar que funciona correctament.&lt;br /&gt;
&lt;br /&gt;
En el fitxer node-rest-api/products.js tenim:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
/* GET ALL PRODUCTS */&lt;br /&gt;
router.get('/', function(req, res, next) {&lt;br /&gt;
  Product.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;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
que s'executa quan fem:&lt;br /&gt;
*http://localhost:3000/products&lt;br /&gt;
i també s'executarà quan tinguem la nostra aplicació Angular (més endavant).&lt;br /&gt;
*http://localhost:4200/products&lt;br /&gt;
&lt;br /&gt;
Podem ficar abans del res.json per comprovar que funciona:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
console.log(products);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sessió de consola de MongoDB==&lt;br /&gt;
El servei de Mongo ha d'estar arrencat:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mongod&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
o bé&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ sudo /etc/init.d/mongod start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
(recordar que la ''d'' ve de dimoni, el servei que s'està executant)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ mongo&lt;br /&gt;
MongoDB shell version: 2.6.10&lt;br /&gt;
connecting to: test&lt;br /&gt;
&amp;gt; show dbs&lt;br /&gt;
...&lt;br /&gt;
product          0.078GB&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
&amp;gt; use product&lt;br /&gt;
switched to db product&lt;br /&gt;
&amp;gt; db&lt;br /&gt;
product&lt;br /&gt;
&lt;br /&gt;
&amp;gt; db.getCollectionNames()&lt;br /&gt;
[ &amp;quot;products&amp;quot;, &amp;quot;system.indexes&amp;quot; ]&lt;br /&gt;
&lt;br /&gt;
o bé:&lt;br /&gt;
&amp;gt; show collections&lt;br /&gt;
products&lt;br /&gt;
system.indexes&lt;br /&gt;
&lt;br /&gt;
&amp;gt; db.products.find()&lt;br /&gt;
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;5cbf292375e0a91fd03740da&amp;quot;), &amp;quot;prod_name&amp;quot; : &amp;quot;XBox One&amp;quot;, &amp;quot;prod_desc&amp;quot; : &amp;quot;New Microsoft XBox One, the latest games console&amp;quot;, &amp;quot;prod_price&amp;quot; : 520, &amp;quot;updated_at&amp;quot; : ISODate(&amp;quot;2019-04-23T15:02:59.791Z&amp;quot;), &amp;quot;__v&amp;quot; : 0 }&lt;br /&gt;
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;5cbf6d0e5e41d216f51ab56c&amp;quot;), &amp;quot;prod_name&amp;quot; : &amp;quot;Sony PS 4&amp;quot;, &amp;quot;prod_desc&amp;quot; : &amp;quot;Sony playstation 4&amp;quot;, &amp;quot;prod_price&amp;quot; : 580, &amp;quot;updated_at&amp;quot; : ISODate(&amp;quot;2019-04-23T19:52:46.471Z&amp;quot;), &amp;quot;__v&amp;quot; : 0 }&lt;br /&gt;
{ &amp;quot;_id&amp;quot; : ObjectId(&amp;quot;5cbf6d3b5e41d216f51ab56d&amp;quot;), &amp;quot;prod_name&amp;quot; : &amp;quot;XBox One&amp;quot;, &amp;quot;prod_desc&amp;quot; : &amp;quot;New Microsoft XBox One, the latest games console&amp;quot;, &amp;quot;prod_price&amp;quot; : 520, &amp;quot;updated_at&amp;quot; : ISODate(&amp;quot;2019-04-23T19:53:31.251Z&amp;quot;), &amp;quot;__v&amp;quot; : 0 }&lt;br /&gt;
&lt;br /&gt;
o millor:&lt;br /&gt;
&amp;gt; db.products.find().pretty()&lt;br /&gt;
&lt;br /&gt;
&amp;gt; db.products.find().pretty()&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;_id&amp;quot; : ObjectId(&amp;quot;5cbf292375e0a91fd03740da&amp;quot;),&lt;br /&gt;
	&amp;quot;prod_name&amp;quot; : &amp;quot;XBox One&amp;quot;,&lt;br /&gt;
	&amp;quot;prod_desc&amp;quot; : &amp;quot;New Microsoft XBox One, the latest games console&amp;quot;,&lt;br /&gt;
	&amp;quot;prod_price&amp;quot; : 520,&lt;br /&gt;
	&amp;quot;updated_at&amp;quot; : ISODate(&amp;quot;2019-04-23T15:02:59.791Z&amp;quot;),&lt;br /&gt;
	&amp;quot;__v&amp;quot; : 0&lt;br /&gt;
}&lt;br /&gt;
{&lt;br /&gt;
	&amp;quot;_id&amp;quot; : ObjectId(&amp;quot;5cbf6d0e5e41d216f51ab56c&amp;quot;),&lt;br /&gt;
	&amp;quot;prod_name&amp;quot; : &amp;quot;Sony PS 4&amp;quot;,&lt;br /&gt;
	&amp;quot;prod_desc&amp;quot; : &amp;quot;Sony playstation 4&amp;quot;,&lt;br /&gt;
	&amp;quot;prod_price&amp;quot; : 580,&lt;br /&gt;
	&amp;quot;updated_at&amp;quot; : ISODate(&amp;quot;2019-04-23T19:52:46.471Z&amp;quot;),&lt;br /&gt;
	&amp;quot;__v&amp;quot; : 0&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Angular 7 Tutorial: Building CRUD Web Application=&lt;br /&gt;
Seguim el següent tutorial:&lt;br /&gt;
&lt;br /&gt;
Angular 7 Tutorial: Building CRUD Web Application&lt;br /&gt;
*https://www.djamware.com/post/5bca67d780aca7466989441f/angular-7-tutorial-building-crud-web-application&lt;br /&gt;
&lt;br /&gt;
'''Què és Material?''':&lt;br /&gt;
*https://material.angular.io/&lt;br /&gt;
'''Material''' és una llibreria optimitzada per a Angular per tal de fer de forma ràpida components UI (formularis, taules,...)&lt;br /&gt;
&lt;br /&gt;
De la pàgina web:&lt;br /&gt;
&amp;lt;pre&amp;gt;Sprint from Zero to App&lt;br /&gt;
Hit the ground running with comprehensive, modern UI components that work across the web, mobile and desktop&lt;br /&gt;
&lt;br /&gt;
Fast and Consistent&lt;br /&gt;
Finely tuned performance, because every millisecond counts. Fully tested across modern browsers.&lt;br /&gt;
&lt;br /&gt;
Versatile&lt;br /&gt;
Themable, for when you need to stay on brand or just have a favorite color. Accessible and internationalized so that all users are welcome.&lt;br /&gt;
&lt;br /&gt;
Optimized for Angular&lt;br /&gt;
Built by the Angular team to integrate seamlessly with Angular.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Possibles errors/problemes que us podeu trobar==&lt;br /&gt;
En el tutorial hi ha un error. ''app/product.ts'' és: (és ''_id'' en comptes de ''id'')&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export class Product {&lt;br /&gt;
    _id: string;&lt;br /&gt;
    prod_name: string;&lt;br /&gt;
    prod_desc: string;&lt;br /&gt;
    prod_price: number;&lt;br /&gt;
    updated_at: Date;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Si després de seguir pas a pas el tutorial no funciona, recordeu que podeu descarregar el codi del GitHub.&lt;br /&gt;
&lt;br /&gt;
Així i tot, en el Github hi ha un error/inconsistència en el tutorial. La ruta de la API és:&lt;br /&gt;
*http://localhost:3000&lt;br /&gt;
i no pas &lt;br /&gt;
*http://localhost:3000/api/v1&lt;br /&gt;
Això s'ha de canviar en el fitxer ''api.service.ts''.&lt;br /&gt;
&lt;br /&gt;
Per tal de comprovar que l'aplicació funciona, allò bàsic és mostrar la llista de productes:&lt;br /&gt;
*http://localhost:4200/products&lt;br /&gt;
&lt;br /&gt;
Per tal de què funcioni, primer de tot hi ha d'haver productes al mongo (pots utilitzar curl per crear productes, com es comenta més amunt).&lt;br /&gt;
&lt;br /&gt;
Així i tot, el professor s'ha trobat amb el següent error:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Failed to load http://localhost:3000/products: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Aquest error el veiem en la consola de l'aplicació Angular (en la consola de les Eines de Desenvolupament, no pas en la consola de Angular CLI)&lt;br /&gt;
&lt;br /&gt;
És un problema de CORS amb la rest API (http://localhost:3000). Hem de fer que la nostra aplicació Express tingui habilitat el CORS:&lt;br /&gt;
*https://stackoverflow.com/questions/7067966/how-to-allow-cors&lt;br /&gt;
&lt;br /&gt;
Per fer-ho hem d'instal·lar el paquet cors:&lt;br /&gt;
*https://www.npmjs.com/package/cors&lt;br /&gt;
'''CORS''' is a node.js package for providing a Connect/Express middleware that can be used to enable CORS with various options.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ npm install cors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I aleshores la solució és ben senzilla. En el fitxer app.js:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
const cors = require('cors')&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
var app = express();&lt;br /&gt;
app.use(cors());&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
D'aquesta manera habilitem el CORS i ja funciona l'aplicació&lt;br /&gt;
*http://localhost:4200/products&lt;br /&gt;
i també crear un nou producte, editar-lo i esborrar-lo, que és el que volíem&lt;br /&gt;
&lt;br /&gt;
=Feina per l'alumne=&lt;br /&gt;
La principal feina és implementar de forma correcta els dos tutorials: primer la REST API; i segon l'aplicació Angular.&lt;br /&gt;
&lt;br /&gt;
Un cop funcioni correctament, i per validar que l'alumne sap quins fitxers són els importants, es proposa les següents modificacions:&lt;br /&gt;
*'''Fàcil''': modificar l'aplicació per tal de què la informació que tenim del producte inclogui també un codi de referència (per exemple un codi de barres, l'anomenarem '''ref''')&lt;br /&gt;
*'''Més difícil''': definir en el MongoDB una col·lecció de categories, i fer que els productes pertanyin a una categoria. Quan creem un producte, en una llista desplegable hem de poder triar la categoria a què pertany el producte. Quan modifiquem el producte també hem de poder canviar de categoria. Quan llistem els productes o la info d'un producte, s'ha de visualitzar la categoria a què pertany.&lt;br /&gt;
&lt;br /&gt;
=Entrega=&lt;br /&gt;
Entregar al Classroom dins el termini previst per la pràctica.&lt;br /&gt;
{{Autor}}, abril 2019&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>