上一篇先將頁面基本功能建立好了,現在就要來處理最麻煩的後端驗證了~
userModel.js
簡單定義一下,(select: false 代表回傳資料時不會顯示 password 這個欄位的資料)
const mongoose = require('mongoose');
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
    },
    email: {
        type: String,
        required: true,
        unique: true,
        lowercase: true,
    },
    photo: String,
    password: {
        type: String,
        required: true,
        minlength: 8,
        select: false,
    },
});
const User = mongoose.model('User', userSchema);
module.exports = User;
userController.js
接著建立 register 以及 login ,目前先將基本功能寫上來,之後再修正:
register 傳入 name, email, password 來建立使用者到資料庫中login 使用 Model.findOne() 來尋找 email 對應的使用者const User = require('../models/userModel');
exports.register = async (req, res) => {
    try {
        const user = await User.create({
            name: req.body.name,
            email: req.body.email,
            password: req.body.password,
        });
        res.json({
            status: 'success',
            data: {
                user,
            },
        });
    } catch (err) {
        console.log(err);
        res.json({
            status: 'error',
        });
    }
};
exports.login = async (req, res) => {
    const { email, password } = req.body;
    try {
        const user = await User.findOne({ email });
        res.json({
            status: 'success',
            data: {
                user,
            },
        });
    } catch (err) {
        console.log(err);
        res.json({
            status: 'error',
        });
    }
};
試著使用註冊然後登入的結果會是這樣

userRoutes.js
然後再定義路徑及相應的 controller
const express = require('express');
const userController = require('../controllers/userController');
const router = express.Router();
router.post('/register', userController.register);
router.post('/login', userController.login);
module.exports = router;
index.js
記得在 index.js 中也要加上 route 的基本路徑
const userRouter = require('./routes/userRoutes');
app.use('/api/v1/users', userRouter);
yarn add bcryptjs
接著將使用者的密碼經過「加密處理」再存進資料庫中!

bcrypt 會幫我們產生一段字串,這樣就能避免將密碼暴露在資料中了

yarn add jsonwebtoken
然後來處理使用者登入後會產生的驗證 token 字串
.select(’+password’)  → 取得 user 的 password 資料bcrypt.compare(password, user.password) → 比對使用者的密碼是否正確jwt.sign() → 產生 token,傳入 payload 及 secret,這邊以物件格式的使用者 email 作為 payload,另外在 .env 中定義一個 JWT_SECRET 字串來作為自訂密鑰(可以任意輸入一個字串)
這樣在登入成功時,就能得到使用者的驗證 token 了

目前差不多就完成簡易的註冊登入功能啦~~~ 接下來就是處理前端的部分了