Sequelize-模型设置器方法不起作用,并且没有错误

时间:2019-05-19 04:54:36

标签: jwt sequelize.js

我正在尝试生成一个新令牌并将其存储在使用MySQL作为DMS的数据库令牌表中。我正在使用jwt库生成令牌。我没有任何错误,并且没有生成我生成的令牌。但是正在生成新用户。此路由处理程序功能负责创建新的用户帐户。还会为该用户创建一个新令牌,以允许他/她执行需要身份验证的操作。

我尝试了各种可能的方法,使用续集为模型设置了setter方法。我阅读了文档,并同时使用了两种方法,但均无效果。 set()和setterMethod两种方式:...代码在这里。 我还尝试创建一个实例,然后访问setter方法,但仍然无法正常工作。 最后,我尝试使用try and catch块尽一切可能使错误显示在终端上,但我无法创建它。 刚才,我尝试在generateAuthToken setter方法中使用console.log“ hello world”,但在服务器上未收到该消息。因此,我认为问题与程序无法识别该函数名称有关。

这是我的令牌模型,是使用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 setter方法的用户路由:

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 :(得分:0)

您的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();
}

答案 1 :(得分:0)

我无法修复它,但我决定只是手动进行操作,而不是调用Sequelize setter方法。它节省了我很多时间,而且效果很好。我只是在路由处理程序函数中做到了这一点,但是如果您想使代码更有条理,则可以创建一个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)
    }
})