Показать сообщение отдельно
  #1 (permalink)  
Старый 03.07.2025, 10:29
Аспирант
Отправить личное сообщение для riaron86 Посмотреть профиль Найти все сообщения от riaron86
 
Регистрация: 27.11.2021
Сообщений: 94

Проблема с jwt
прошел курс по разработке интернет магазина на reacr node express postgress (sequelize)
В конце препод все разжевывает но учащимся надо самим создать модуль корзины. Столкнулся со следующей проблемой, чтобы получить все устройства добавленные в корзину надо знать userId кототрый содержится в jwt token-е, для чего я импортирую userController в basketController чтобы расшифровать токен и вытянуть userId, но при импорте авторизация перестает работать что делать вот код:
UserController.js
const ApiError = require('../error/ApiError');
const bcrypt = require('bcrypt')
const jwt = require('jsonwebtoken')
const {User, Basket} = require('../models/models')

const generateJwt = (id, email, role) => {
    return jwt.sign(
        {id, email, role},
        process.env.SECRET_KEY,
        {expiresIn: '24h'}
    )
}

class UserController {
    async registration(req, res, next) {
        const {email, password, role} = req.body
        if (!email || !password) {
            return next(ApiError.badRequest('Некорректный email или password'))
        }
        const candidate = await User.findOne({where: {email}})
        if (candidate) {
            return next(ApiError.badRequest('Пользователь с таким email уже существует'))
        }
        const hashPassword = await bcrypt.hash(password, 5)
        const user = await User.create({email, role, password: hashPassword})
        const basket = await Basket.create({userId: user.id})
        const token = generateJwt(user.id, user.email, user.role)
        return res.json({token})
    }

    async login(req, res, next) {
        const {email, password} = req.body
        const user = await User.findOne({where: {email}})
        if (!user) {
            return next(ApiError.internal('Пользователь не найден'))
        }
        let comparePassword = bcrypt.compareSync(password, user.password)
        if (!comparePassword) {
            return next(ApiError.internal('Указан неверный пароль'))
        }
        const token = generateJwt(user.id, user.email, user.role)
        return res.json({token})
    }

    async check(req, res, next) {
        const token = generateJwt(req.user.id, req.user.email, req.user.role)
        return res.json({token})
    }
}

module.exports = new UserController()


basketController.js
const uuid = require('uuid')
const path = require('path');
const {Users,Basket, BasketDevice, User, Device} = require('../models/models')
const ApiError = require('../error/ApiError');
const {where} = require("sequelize");
const userController = require('./userController')
const jwt = require('jsonwebtoken')

class BasketController {
    async create(req, res, next) {
        try {
            let {deviceId} = req.body
            const generateJWT=userController.check;
            let usrId;
            jwt.verify(generateJWT,process.env.SECRET_KEY, function(err, decoded) {
                usrId=decoded[0];
            });
            const basket = await Basket.findOne({where: {userId:usrId}});

            const basketDevice = await BasketDevice.create({basketId: basket.id,deviceId:deviceId });
                return res.json(basket.id,basketDevice);
        } catch (e) {
            next(ApiError.badRequest(e.message))
        }

    }

    async getAll(req, res) {
        let usrId;
        const generateJWT=userController.check;

        jwt.verify(generateJWT,process.env.SECRET_KEY, function(err, decoded) {
            usrId=decoded[0];
        });
        const basket = await Basket.findOne({where: {userId:usrId}});
        const  basketDevices = await BasketDevice.findAndCountAll({where: {basketId:basket.id}});
        const bdevices={};
        basketDevices.map((bd)=>(
            bdevices.push(Devices.findOne({where: {id:bd.deviceId}}))
    ));
        return res.json(bdevices)
    }


}

module.exports = new BasketController()
Ответить с цитированием