Sequelize - метод установки модели не работает, и я не получаю ошибок - PullRequest
1 голос
/ 19 мая 2019

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

Я пытался использовать все возможные способы, чтобы настроить метод установки для модели с помощью sequelize. Я прочитал документы и использовал оба пути, и ни один не работал. Два способа set () и setterMethod: ... код идет здесь. Я также попытался создать экземпляр и затем получить доступ к методу setter, но это все равно не сработало. Наконец, я пытался всеми возможными способами получить сообщение об ошибке на терминале, используя блок 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()
    }
})

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

Ответы [ 2 ]

0 голосов
/ 19 мая 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)
    }
})
0 голосов
/ 19 мая 2019

Ваша локальная копия 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...