Sindy's Wiki - Lawlzilla7/ProjectTech-Team2 GitHub Wiki

Procesverslag Project Tech Sindy

CMD 2024, Jaar 2 Blok 3

Auteur: Sindy de Jong (500895558)

Link naar: Mijn oefen branche

Link naar: Mijn branch binnen ons GitHub project

Datum: 11-04-2024


Week 1

Doelen
  • Les 1.1 [WG] JavaScript herhalen

    • Variabelen
    • Datatypen
    • Logica
    • Arrays
  • Les 1.2 [WG] Git & GitHub basics leren

    • Github bestand opzetten en gezamenlijke repository aanmaken. Hierin een master branch en side branches.
  • Les 1.3 [WG] JavaScript herhaling

    • Functies (parameters, return, arrow functies)
    • Objecten (dot & bracket notatie)
    • Loops
    • import and export
  • Les 1.4 [WG] Uitleg over JSON krijgen

    • JSON-notatie & -bestanden
    • Fetch Web API & lokaal JSON bestand
    • Promise afhandelen met .then()
    • Fetch in Async functie met await

Week 2

Doelen
  • Les 2.1 [WG] Backend basis

    • Http request & response
    • Command line
    • NodeJS & NPM
    • Node modules
    • Data API
  • Les 2.2 [WG] Frontend basis

    • API basics, empty & loading state
    • Keuze voor specialisatie maken (docenten inventariseren)
  • Les 2.3 [WG] Concept eindopdracht & Verdieping Frontend

    • Verdieping frontend: Lijstjes (ListJS)
    • Back-enders richten de eerste versie van hun backend in
  • Les 2.4 [WG] Concept eindopdracht & Verdieping Backend

    • Verdieping kiezen en Teams indeling
    • Backend verdieping: Routes, static, templates
    • Front-enders gaan eerste opzet voor hun component maken
  • Team gevormd: Team 2 (met Esmé, Yani, Furkan en Kenza)
  • Specialisatie gekozen: Backend

Week 3

Doelen:

Formulier "add movie" aanmaken

Formulier aanmaken

Competentie: Oriënteren en begrijpen

Ik heb de voorbeeld html en css code voor een formulier gebruikt van de voorbeeld code op de project tech GitHub.

Het ingevulde formulier ziet er zo uit:

form1

Data uit formulier weergeven

De ingevoerde data uit het formulier wordt na het versturen weergeven op een pagina:

addedmovie1

Dat heb ik gedaan met deze code:

addedmoviecode
Database verbinden

Database verbinden

Ik heb mijn eigen database aangemaakt via MongoDB. Hierbij werkte het verbinden met de database als ik mijn hele uri neerzetten, dus inclusies wachtwoord dat voor iedereen zichtbaar was.

Error 1: uri pakt mijn .env niet

Toen ik probeerde te verbinden via de uri waarmee hij de inlogdata uit het .env bestand haald, kreeg ik een error. uri_error1

Oplossing error 1

In mijn uri verwijs in naar het wachtwoord met DB_password en in mijn .env bestand met DB_pass. Dus ik moest simpelweg zorgen dat die namen gelijk waren en toen was de uri wel correct. Toen kreeg ik een andere error.

Error 2: poort 8000 is already in use

uri_error11

Oplossing error 2

Blijkbaar was het probleem dat ik 2x app.listen(8000) had staan in mijn server. Een helemaal bovenaan en een helemaal onderaan. Vandaar de error met "address already in use :::8000.

Filmpje van een runthrough van mijn oefen branche:

filmpje_testcode.mov

Week 4

Doelen:

Data opslaan in database MongoDB

Data uit formulier opslaan in database MongoDB:

Ik heb hiervoor gekeken naar de voorbeeldcode die op de project tech Github stond om data over een bepaalde film op te halen uit de database en te laten zien in de terminal. Dat is deze code:

mflixdataophalen

Deze code heb ik vervolgens aangepast door er .insertOne van te maken. Ook heb ik de code om het antwoord van een formulier weer te geven op een pagina eraan toegevoegd. Hierdoor wordt er na het verzenden van een formulier een overzicht van de antwoorden weergeven op een pagina en wordt het toegevoegd aan de database. De code ziet er dan zo uit:

addmovie2
Aanmelden en inloggen

Data uit aanmeld formulier opslaan in database MongoDB

Hiervoor heb ik dezelfde methode gebruikt als voor het opslaan van een film. Ik heb een nieuwe database aangemaakt genaamd 'gebruikers' met daarin een collectie genaamd 'accounts'. Momenteel bestaat het aanmaken van een account alleen maar uit een gebruikersnaam en wachtwoord.

aanmelden

Inloggen met gegevens uit de database

Om te kunnen inloggen met een bestaand account, wordt er gekeken if er in de database een resultaat te vinden is voor de combinatie van de ingevoerde gebruikersnaam en wachtwoord. Daarna wordt er een if else statement gebruikt om aan te geven of er een resultaat is = ingelofd, of niet = error, niet ingelogd.

inloggen
Linters

ESLint

Mijn ESLint instellingen:

eslint

Week 5

Doelen:

Lijst van alle toegevoegde films laten zien op pagina (handig voor favorieten feature later)

Movies list met .toArray

Eerst probeerde ik met res.send een lijst van alle toegevoegde films weer te geven na het verzenden van een film, maar dat lukte niet omdat ik dan html code stopte in de res.send in plaats van javascript. Ivo adviseerde mij om een view aan te maken.

Error 1: waarde van laatst toegevoegde film herkent hij niet

movielist

Oplossing error 1

Als oplossing hiervoor heb ik een variabele van de addedMovie (titel, plot en description) gemaakt.

movielist_fix
XSS: Data Sanitisen

XSS toepassen bij inloggegevens

XSS bij account aanmaken

Bij het aanmaken van een account moet de gebruiker zijn gebruikersnaam en wachtwoord invullen en hiermee wordt er een account aangemaakt. Deze data moet worden gesanitised, zodat bezoekers via dat inputveld geen aanslag op mijn site kunnen doen.

xss_signup

XSS bij inloggen

Ook bij het inloggen kan de gebruikers gegevens invoeren, daarom moet deze ingevoerde data ook gesanitesed worden voordat het verder wordt gebruikt. xss_login

BcryptJS: Data encrypten

Wachtwoord hashen opslaan

Om een wachtwoord te hashen heb ik bcrypt.hash gebruikt. De 10 staat voor hoe sterk het wachtwoord gehashed is.

crypt_signup

Inloggen met wachtwoord dat gehashed is

Toen ik wilde inloggen door mijn wachtwoord in te voeren, lukte dat niet. Toen besefte ik mij dat het wachtwoord dat je invoerd ook gehashed moet worden en dan moet worden vergeleken met het gehashde wachtwoord in de database. Dit heb ik gedaan met bcrypt.compare.

crypt_inloggen
Express sessions

Express session inloggen

Bij het inloggen wordt de sessie gekoppeld aan het account dat bij de gebruikte username hoort.

nainloggennaaraccount

Ik heb toegevoegd dat je na het succesvol inloggen meteen naar de "mijn account" pagina wordt gestuurd.

mijnaccount

Express session uitloggen

Verder wil ik dat als er al is ingelogd en je naar "inloggen" gaat, je niet opnieuw het inlogscherm krijgt, maar dat er komt te staan "je bent al ingelogd, wil je uitloggen?". Dit kan met de .destroy functie. Een verdere stap zou zijn dat als je al ingelogd bent, er uitloggen komt te staan in de nav.

uitloggencode

Ik heb er voor gekozen om nu de uitlogknop op de "mijn account" pagina te stoppen.

uitloggenhtml


Week 6

Doelen:

  • Vragen:
    • Multer error
    • heb ik xss goed toegepast
  • Doen:
    • Eerste frontend html code omgezet in .ejs structuur
    • SLUG
Profielfoto uploaden

File uploaden met Multer

Via "Mijn account" kun je een profielfoto uploaden:

uitloggenhtml

Error 1: de filename wordt niet herkend

Ik had alleen req.file.avatar gebruikt maar dan komt er "null" te staan als waarde in de database.

avatar_error_db

Na gegoogled te hebben kwam ik erachter dat er een path module is die het hele pad ophaalt. Via nodejs.org heb ik meer informatie opgezocht over de path module. nodejs.org/api/path

Oplossing error 1

Ik heb de path module gebruikt en nu komt wel het hele pad als waarde in de database.

Error 2: onjuiste url

patherror

In de source moet /static/weg worden gelaten. Dit kan worden gedaan met .replace (Mozilla, hiermee vervang ik het /static/ gedeelte met leegte.

Oplossing error 2

Dit is dan de code voor het hele pad wat in de img src moet staan in de html:

path_clean

Error 3: res.send status

avatar_send_error

Oplossing error 3

Ik heb er dit van gemaakt en nu werkt het: res.send(Avatar succesvol toegevoegd.); Ik denk dat het probleem de ' haakjes waren en dat het dus geen backticks waren.


Week 7

Doelen:

  • Filteren en sorteren van api data met knoppen
  • Auto API kunnen koppelen aan gebruikers data --> gefavoriete auto komt bij gebruiker te staan --> handig voor favorieten functie.
  • Extra API met autodealers?
Gebruikersnaam wijzigen

Gebruikersnaam wijzigen

Error 1: ObjectId

Ik probeerde te maken dat een gebruiker zijn gebruikersnaam kan wijzigen. Hiervoor heb ik de code over update uit de powerpoint over forms en databases gebruikt, maar ik krijg deze error en ik snapte niet hoezo. Ik heb hulp aan Ivo gevraagd.

wijzig_gebruikersnaam_error1

Error 2: new ObjectId

Ivo zei dat ik er _id: new ObjectId(req.body.id) van moest maken. Hier kreeg ik ook een error bij.

wijzig_gebruikersnaam_error2

Oplossing errors

Ik mijn code voor het toevoegen en wijzigen van een profielfoto erbij gepakt en deze toegepast bij mijn code. Hierdoor heb ik updateOne({ username: username }, gebruikt in plaats van ObjectId gebruiken. Ook heb ik voor het gemak een constante voor req.body.updatedUsername aangemaakt. Dus nu zoekt hij naar de username van de user waarmee de sessie is gestart en wordt deze username aangepast naar wat er in het form is ingevuld. Vervolgens wordt de gebruiker geredirect naar de inlogpagina waar hij opnieuw kan inloggen.

wijzig_gebruikersnaam_fix
Wachtwoord wijzigen

Wachtwoord wijzigen

Error 1: null

Ik kreeg als nieuwe wachtwoord waarde "null" terug.

wijzig_wachtwoord_error

Oplossing error 1

Ik vroeg aan ChatGPT waarom ik als waarde "null" terug kreeg. Ik was vergeten om "err" toe te voegen aan de bcrypt.hash.

wijzig_wachtwoord_fix
Email wijzigen

Email wijzigen

Dit is hoe ik het email wijzigen heb gedaan. Hiervoor heb ik de code voor het wijzigen van een gebruikersnaam gebruikt. In plaats van opnieuw moeten inloggen, wordt de gebruiker meteen opnieuw herleidt naar de "my account" pagina waar het nieuwe emailadres meteen zichtbaar is.

wijzig_email
Account verwijderen

Account verwijderen

Error 1: sessie error

Het is gelukt om het account uit de database te verwijderen, maar na het verwijderen kreeg ik deze error. Hij wil de pagina "my account" nog laden, omdat de sessie nog steeds bezig is, maar er dus geen gebruiker meer is waarvan hij de data kan ophalen.

verwijder_account_error

Oplossing error 1

Ik heb dit opgelost door na het verwijderen van het account de sessie te beëindigen.

verwijder_account_fix

Week 8

Doelen:

Grote "testing" merge 1

Backend code merge 1

Op dinsdag 2 april hebben wij een grote merge gedaan. Hierbij heb ik mijn code naar testing gepusht en vervolgens heb ik samen met Esmé haar code ook naar testing gepushed. Hierbij hebben wij samen de merge conflicten opgelost. Dit was de eerste keer dat wij onze backend codes hebben samengevoegd. Dit is succesvol gegaan.

grote_commit
.env zichtbaar

Security issue: .env zichtbaar

.env bestand was zichtbaar op GitHub

env

Ging de .gitignore checken en ik zag dat er overal een sterretje voor stond. Hierdoor werken die bestanden niet genegeerd.

gitignore_fout

Na de sterretjes weg te hebben gehaald en het wachtwoord veranderd te hebben, ging ik het pushen en checken of .env nog steeds op GitHub te zien was. Dit was helaas nog steeds zo, ook al stond het nu wel goed in de .gitignore.

Oplossing

Op google ging ik zoeken naar een oplossing voor dat mijn .env bestand nog steeds op GitHub werd vertoond, ook al staat het in de .gitignore. op stackoverflow vond ik een antwoord hierop. Het kwam doordat .env ooit online stond, dat dat nu niet genegeerd meer wordt. Om dit op te lossen moest ik het .env bestand uit de cache verwijderen met een command.

env_oplossing
Favorieten

Item toevoegen aan favorieten

Ik had een idee voor een stukje code waarmee je via een knop, met daarachter een form met een post-request en een input met subit, een item aan jouw favorieten kon toevoegen. Echter werkte dit niet meteen. Esmé ging verder met het uitwerken van de "favorieten" functie, dit was tevens ook haar taak. Hieronder is de voor mijn ideetje te zien:

favorieten_poging1
Imagemin

Imagemin poging

Wij hebben erg veel afbeeldingen, omdat elke auto uit de api een eigen afbeelding bevat. Dit zijn er ongeveer 50. Het is veel werk om die allemaal zelf te moeten compressen, daarom wilde ik de module Imagemin proberen te gebruiken. Ik heb de code overgenomen die op de imagemin pagina van de npmjs site staat. Helaas kreeg ik hierbij een error.

imagemin_error

Ik heb hulp gevraagd aan Ivo en hij legde mij uit dat de Imagemin module een module is die je niet constant hoeft uit te voeren, maar eigenlijk maar 1x om je plaatjes 1x kleiner te maken. Ik kwam erachter dat deze module dus anders werkt dan ik dacht en heb ervoor gekozen om deze nu niet toe te passen in het project.

Grote "testing" merge 2

Backend code merge 2

Op vrijdag 5 april hebben wij een tweede grote merge naar testing gedaan. Hierbij heeft eerst Furkan zijn code voor build, sorteren en filteren gepusht, daarna Esmé haar backend code voor favorieten en daarna ik mijn complete backend code en alle pagina's die ik van HTML naar EJS heb omgezet. Toen ik mijn code wilde mergen kreeg ik een conflict-melding:

merge2

Conflicten

Er waren een aantal conflicten die ik zelf rustig heb opgelost. Dit waren de conflicten:

merge2_conflicten

Het mergen was succesvol gegaan.

merge2_opgelost
Omgezette HTML pagina's

HTML pagina's die ik heb omgezet naar ejs en werkend heb gemaakt:

  • Index
  • Signup
  • Login
    • Logged in
    • Notloggedin
  • Build
  • Account
    • Update_email
    • Update_password
    • Update _ username
    • Delete_account
    • Account deleted
Main merge

Main merge 1

  • Inleveren op zondag 7 april voor 29:59

Week 9

Doelen:

  • Presentatie op 11 april

Bronnenlijst

Bronnen

Nb. Wees specifiek ('css-tricks' als bron is bijv. niet specifiek genoeg). Nb. ChatGpT en andere AI horen er ook bij. Nb. Vermeld de bronnen ook in je code.

  1. Voorbeeld code voor formulier op: de project tech GitHub.
  2. Informatie over node path module op: nodejs.org
  3. Uitleg over .replace op: Mozilla
  4. Oplossing voor gitignore env file op: stackoverflow
  5. ChatGPT 3.5
  6. Uitleg over imagemin op: de npmjs site
⚠️ **GitHub.com Fallback** ⚠️