Skip to content
Roene edited this page Mar 19, 2020 · 5 revisions

Deze week ben ik doorgegaan met het werken aan mijn feature. Vorige week was het gelukt om data op te sturen naar de database. Deze week wilde ik het voor elkaar krijgen om de wachtwoorden in de database te hashen en om in te kunnen loggen met de gegevens die in de database stonden.

MongoDB vs Mongoose

In eerste instantie gebruikte ik niet het pakketje mongoose om te vertellen wat er in de database moest komen, maar gebruikte ik alleen maar mongoDB. Omdat het mij niet lukte om na het registreren in te loggen heb ik verschillende voorbeelden geprobeerd. Deze werkte allemaal met mongoose. Ook werkte mijn klasgenoot Andy hiermee en die zei dat het veel makkelijker ging met mongoose. Daarom ben ik mongoose gaan gebruiken voor dit project.

Registreren

Het registreren had ik vorige week al werkend maar omdat ik met mongoose ben gaan werken heb ik dit weer moeten aanpassen. Eerst moet er connectie gemaakt worden met de database dat gebeurd in het bestand db.js

const mongoose = require('mongoose')

require('dotenv').config()

const uri = process.env.MONGODB_URI

const mongoConnection = mongoose.connect(uri, { useNewUrlParser: true, useUnifiedTopology: true }).then(() => console.log('MongoDB connected...') )

module.exports = mongoConnection

Vervolgens heb ik een model aangemaakt waarin ik vertel hoe de data die naar de database gaat eruit moet komen te zien. Dit gebeurd in het bestand user.js in de map model

const userSchema = new mongoose.Schema({
    firstname: {
        type: String,
        required: true
    }, 
    surname: {
        type: String,
        required: true
    }, 
    age: {
        type: Number,
        required: true
    }, 
    gender: {
        type: String,
        required: true
    }, 
    club: {
        type: String,
        required: true
    }, 
    // file: {
    //     type: String,
    //     required: true
    // }, 
    email: {
        type: String,
        required: true
    }, 
    password: {
        type: String,
        required: true
    }, 
    searchGender: {
        type: String,
        required: true
    }, 
    description: {
        type: String,
        required: false
    }, 
    tokens: [{
        token: {
            type: String,
            require: true
        }
    }]
})

// BRON : https://medium.com/swlh/jwt-authentication-authorization-in-nodejs-express-mongodb-rest-apis-2019-ad14ec818122
userSchema.pre('save', async function (next) {
    const user = this
    if(user.isModified('password')){
        user.password = await bcrypt.hash(user.password, 8)
    }
    next()
})

Ook word hier het hashen van wachtwoorden geregeld. In de user.js in de map routes wordt de post request afgehandeld.

.post('/signup', upload.single('cover'), async (req, res) => {
        const {
            firstname,
            surname,
            age,
            gender,
            club,
            email,
            password,
            searchGender,
            description
        } = req.body

        const user = new User({
            firstname,
            surname,
            age,
            gender,
            club,
            email,
            password,
            searchGender,
            description
        })
        try {
            await user.save()
            const token = await user.generateAuthToken()
            res.redirect('/')
        } catch (err) {
            res.status(400).send(err)
        }
    })

Zo ziet mijn database eruit nu :

Database

Inloggen

Voor het inloggen moeten de ingevoerde email en wachtwoord een juiste combinatie zijn van wat in de database staat.

De post request wordt afgehandeld in de user.js in de map routes

.post('/login', async (req, res) => {
        try {
            const { email, password} = req.body
            const user = await User.findByCredentials(email, password)
            if (!user) {
                res.status(401).send({ error: 'Login klopt niet' })
            }
            const token = await user.generateAuthToken()
            res.send( { user, token })
        } catch (err) {
            res.status(400).send(err)
        }
    })

In de user.js in de map model wordt vervolgens gekeken of de credentials overeen komen.

userSchema.statics.findByCredentials = async (email, password) => {
    const user = await User.findOne({ email })
    if (!user) {
        throw new Error({ error: 'Geen geldig emailaddres' })
    }
    const isPasswordMatch = await bcrypt.compare(password, user.password)
    if (!isPasswordMatch) {
        throw new Error({ error: 'Wachtwoord klopt niet' })
    }
    return user
}

Bronnen

Om alles hierboven werkend te krijgen heb ik verschillende voorbeelden geprobeerd :

  1. Voorbeeld 1
  2. Voorbeeld 2
  3. Voorbeeld 3
  4. Voorbeeld 4
  5. Voorbeeld 5

Pas bij voorbeeld 5 heb ik het werkend gekregen.

ToDo

Nu ik het registreren en inloggen werkend heb gekregen wil ik de aankomende week het uitloggen werkend krijgen, authenticatie als je niet bent ingelogd zodat je niet alle pagina's kan zien en het uploaden van een afbeelding naar de database wil ik werkend krijgen.

Clone this wiki locally