@kiberchainik
начинающий найкрутейшЫй програмЁр

Как составить ассоциацию squelize один к одному?

на ноде работаю с базой mysql через sequelize но при запросе выходит ошибка
TypeError: newuser.setTokenModel is not a function
в то время как setTokenModel должен генерить сам sequelize

import { DataTypes } from "sequelize";
import {sequelize} from '../db/connection.js'

export const TokenModel = sequelize.define("token", {
    id: {type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true, required: true},
    user: {type: DataTypes.INTEGER, required: true},
    refreshToken: {type: DataTypes.STRING, required: true}
});


import { DataTypes } from "sequelize";
import {sequelize} from '../db/connection.js'
import { TokenModel } from "./token.model.js";

export const UsersModel = sequelize.define("users", {
    email: {type: DataTypes.STRING, unique: true, required: true},
    password: {type: DataTypes.STRING, required: true},
    isActivated: {type: DataTypes.BOOLEAN, defaultValue: false},
    activationLink: {type: DataTypes.STRING}
});

UsersModel.hasOne(TokenModel, {onDelete: 'cascade'})

sequelize.sync().then(() => {
    console.log('table created successfully!');
}).catch((error) => {
    console.error('Unable to create table : ', error.sqlMessage);
});


import {UsersModel} from '../models/users.model.js'
import {TokenModel} from '../models/token.model.js'
import bcrypt from 'bcrypt'
import { v4 as uuidv4 } from 'uuid'
import mailService from './mail-service.js'
import tokenService from './token-service.js'
import UserDto from '../dtos/user-dto.js'

class UserService {
    async registration(email, password) {
        const user = await UsersModel.findOne({email})

        if(user) {
            throw new Error (`Пользователь с почтой ${email} уже существует`)
        }

        const hashPassword = await bcrypt.hash(password, 3)
        const activationLink = uuidv4()

        await UsersModel.create({email, password: hashPassword, activationLink})
            .then(newuser=>{ 
                const userDto = new UserDto(newuser.dataValues) // id, email, isActivated
                const tokens = tokenService.generateTokens({...userDto})
                TokenModel.create({user: userDto.id, refreshToken: tokens.refreshToken}).then(token=>{
                    newuser.setTokenModel(token).catch(err=>console.log(err));
                });
            }).catch(err=>console.log(err));

        await mailService.sendActivationMail(email, activationLink)

        return {...tokens, user: userDto}
    }
}

export default new UserService()


newuser.setTokenModel(token).catch(err=>console.log(err));
                            ^

TypeError: newuser.setTokenModel is not a function
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Как составить ассоциацию squelize один к одному?

В MySQL связи "один к одному" не существует в принципе. Точнее, такая связь нереализуема на изменяемом наборе данных. Неважно, напрямую или через какой-либо ORM, включая и Sequelize.

Возможна только реализация связи "один к (ноль либо один)".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы