Sequelize - метод установки модели не работает, и я не получаю ошибок

Я пытаюсь создать новый токен и сохранить его в своей таблице токенов базы данных, которая использует MySQL в качестве DMS. Я генерирую токен с помощью библиотеки jwt. Я не получаю ошибок, и мой сгенерированный токен не генерируется. Но новый пользователь создается. Эта функция обработчика маршрута отвечает за создание новой учетной записи пользователя. Что также создает новый токен для этого пользователя, чтобы позволить ему / ей выполнять действия, требующие аутентификации.

Я пробовал всеми возможными способами настроить метод установки для модели с помощью sequelize. Я прочитал документы и использовал оба способа, и ни один из них не работал. Двумя способами являются set () и setterMethod: ... здесь идет код. Я также попытался создать экземпляр, а затем получить доступ к методу установки, но это все еще не сработало. Наконец, я пробовал все возможные способы получить сообщение об ошибке, отображаемое на терминале, используя блок try и catch, но мне не удалось его создать. Только что я попытался записать console.log «hello world» в методе установки generateAuthToken, но не получил это сообщение на сервере. Итак, я думаю, что проблема связана с тем, что программа не может распознать это имя функции.

Вот моя модель токена, определенная с помощью библиотеки sequelize:

const jwt = require('jsonwebtoken')

const sequelize = require("../db/sequelize")

const User = require("./user");

const TokenSchema = sequelize.define("token", {
    userId: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: {
          model: 'User',
          key: 'id'
        }
    },
    token: {
        type: Sequelize.STRING,
        allowNull: false
    }
}, {
    tableName: 'tokens',
    classMethods: {
        associate : function(models) {
          TokenSchema.belongsTo(models.User)
        }
    },
    setterMethods: {

        async generateAuthToken(user) {
              const token = await jwt.sign({ id: user.id }, process.env.JWT_SECRET)

              this.setDataValue('token', token);
              this.setDataValue('userId', user.id);

      }, 
    }
  })


module.exports = TokenSchema

Вот пользовательский маршрут, который вызвал метод установки generateAuthToken из модели токена:

const express = require('express')
const multer = require('multer')
// const sharp = require('sharp')
const User = require('../models/user')
const Token = require('../models/token')

const auth = require('../middleware/auth')
const { sendWelcomeEmail, sendCancelationEmail } = require('../emails/sendEmail')
const router = new express.Router()

router.post('/users', async (req, res) => {

    const user = new User(req.body)

    try {
        await user.save()

        await Token.generateAuthToken(user.id)

        res.status(201).send({ user })

    } catch (e) {
        res.status(400).send()
    }
})

Печально то, что я не получаю ошибок. Что затрудняет отладку.


person Lami    schedule 19.05.2019    source источник


Ответы (2)


Ваша локальная копия TokenSchema обновляется вашим generateAuthToken методом, но не сохраняется в базе данных. Другими словами, ваш объект Javascript обновлен, но вам нужно отправить его так:

async generateAuthToken(user) {
    const token = await jwt.sign({ id: user.id }, process.env.JWT_SECRET)

    this.setDataValue('token', token);
    this.setDataValue('userId', user.id);

    await this.save();
}
person TheWildHealer    schedule 19.05.2019
comment
Это не помогло. Только что я попытался передать console.log hello world в методе установки generateAuthToken, но не получил это сообщение на сервере. Итак, я думаю, что проблема связана с тем, что программа не может распознать это имя функции. - person Lami; 19.05.2019

Мне не удалось это исправить, но я решил просто сделать это вручную, а не вызывать метод установки Sequelize. Это сэкономило мне много времени и отлично работает. Я просто сделал это прямо в функции обработчика маршрута, но если вы хотите сделать свой код более организованным, вы можете просто создать файл util.js, в котором есть все ваши функции, которые помогают вам в определенных вещах. Вот мой код:

router.post('/users', async (req, res) => {

    const user = new User(req.body)

    try {
        await user.save()

        const generatedToken = await jwt.sign({ id: user.id }, process.env.JWT_SECRET)

        const token = new Token({ userId: user.id, token: generatedToken})

        await token.save();

        res.status(201).send({ user, token })

    } catch (e) {
        res.status(400).send(e)
    }
})
person Lami    schedule 19.05.2019