Back end - Adriaan350/blok-tech GitHub Wiki

Database connectie

Hij haalt de database op via een hostlink en die wordt opgehaald uit het .env bestand. Dat wordt gedaan omdat in het .env bestand gevoelige gegevens zitten. Door .gitignore wordt .env ook niet mee gestuurd naar de github bij het pushen.

require('dotenv').config();
const uri = process.env.ATLAS_URI;

const connectie = async (mongoose) => {
  try {
    await mongoose.connect(uri, {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useFindAndModify: false,
      useCreateIndex: true
    });
    console.log('Connectie werkt');
  } catch (err) {
    console.log('Connectie werkt niet');
  }
};

module.exports = connectie;

Routes

Hier staan alle routes naar alle pagina's, ook staat de 404 hier weergegeven. Als de gebruiker de specifieke / intypt dan wordt de pagina gerendered.

app.get('/login', (request, response) => {
  response.render('login')
});

app.get('/register', (request, response) => {
  response.render('register')
});

app.get('/instellingen', magIk, (request, response) => {
  response.render('instellingen')
});

app.get('/voetbal', magIk, (request, response) => {
  response.render('voetbal')
});

app.get('/delete', (request, response) => {
  response.render('delete')
});

app.get('/', magIk, (request, response) => {
  response.render('index', {
    name: request.user.name
  });
});

app.get('/logout', (request, response) => {
  request.logout();
  request.flash('uitgelogd');
  response.redirect('login');
});

app.get('*', (request, response) => {
  response.send('NOPE 404', 404);
});

Model

Hier is het schema. Daar zet ik in wat er moet gebeuren in de database. Dus email is een type string en moet uniek zijn.

const mongoose = require('mongoose');
var passportLocalMongoose=require("passport-local-mongoose");
require('../connect.js')

const UserForm = new mongoose.Schema({
    email: {
        type: String,
        require: true,
        unique: true
    },
    username: {
        type: String,
        require: true,
        unique: true
    },
    password: {
        type: String,
        require: true
    },
    name: {
        type: String,
        require: true,
    },
    age: {
        type: Number,
        require: true,
    }
});

UserForm.plugin(passportLocalMongoose);

const Users = mongoose.model('Users', UserForm);

module.exports = Users;

Register

De gebruiker heeft alle velden ingevult en drukt op "lets go". Zodra dat gebeurt is wordt de onderstaande code geactiveerd als het ware. Ten eerste wordt het wachtwoord gehashed met bcrypt. Vervolgens pakt hij alle tables uit de variabele user en gaan hij alle velden langs voor wat er ingevult is door de gebruiker. Dan worden alle gegevens in de database opgeslagen. Als dat lukt wordt de gebruiker doorgestuurd naar login om vervolgens te kunnen inloggen. Als dat niet lukt dan wordt de error gecatcht en dan krijgt de gebruiker een error in zijn/haar scherm.

app.post("/registered", async (request, response) => {
  try {
    request.body.password = bcrypt.hashSync(request.body.password, 10);
    const user = new User(request.body);
    const result = await user.save();
    response.redirect('login');
  } catch (error) {
    response.status(500).send(error);
  }
});

Update

In het form vult de gebruiker zijn/ haar nieuwe wachtwoord in en drukt op enter. Vervolgens komt de onderstaande code in actie, als eerste hashed hij het nieuwe wachtwoord met bcrypt. Vervolgens vind hij de gebruikersnaam van de gebruiker met user findone. Als de gebruikersnaam gevonden is uit de sessie dan wordt het wachtwoord aangepast. Als dat niet lukt wordt de gebruiker niet doorgestuurd maar krijgt hij/zij een error die dan is gevangen door catch.

app.post('/change', magIk, async (request, respond) => {
  try {
    request.body.password = bcrypt.hashSync(request.body.password, 10);
    const filter = { username: request.user.username };
    const user = await User.findOne({ username: request.user.username });
    await User.updateOne(filter, { password: request.body.password });
    await user.save()
      .then(() => { respond.redirect('/'); });
  } catch {
    respond.status(500).send();
  }
});

Delete

Als de gebruiker zijn/haar gebruikersnaam intoetst dan wordt diegenes account verwijderd. Dus in het form vult de gebruiker zijn/ haar gebruikersnaam in en drukt op enter. Vervolgens komt de onderstaande code in actie hij vind de gebruikersnaam en verwijderd de hele gebruiker met alle gegevens met FindOneAndDelete. Als dat niet lukt wordt de gebruiker niet doorgestuurd maar krijgt hij/zij een error die dan is gevangen door catch.

app.post("/delete", async (request, response) => {
  try {
    const user = await User.findOneAndDelete({ username: request.body.username }).exec();
    if (!user) {
      return response.status(400).send({ message: "De gebruikersnaam bestaat niet" });
    }
    response.redirect('register')
  } catch (error) {
    response.status(500).send(error);
  }
});

Bronnen

https://mongoosejs.com/docs/documents.html

https://nodejs.org/en/docs/

https://www.npmjs.com/package/bcrypt

https://stackoverflow.com/

https://www.youtube.com/channel/UCFbNIlppjAuEX4znoulh0Cw