Jwt Sequelize-模型设定器方法不起作用,我没有得到任何错误

Jwt Sequelize-模型设定器方法不起作用,我没有得到任何错误,jwt,sequelize.js,Jwt,Sequelize.js,我试图生成一个新的令牌并将其存储在我的数据库令牌表中,该表使用MySQL作为DMS。我正在使用jwt库生成令牌。我没有收到任何错误,并且没有生成生成的令牌。但新用户正在生成。此路由处理程序函数负责创建新的用户帐户。它还为该用户创建一个新令牌,以允许他/她执行需要身份验证的操作 我尝试使用各种可能的方法为使用sequelize的模型设置setter方法。我读了文件,两种方法都用了,但都不管用。这两种方法是set()和setterMethod:…代码在这里。 我还尝试创建一个实例,然后访问sette

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

我尝试使用各种可能的方法为使用sequelize的模型设置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()
    }
})

可悲的是我没有犯错。这使得调试变得非常困难。

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

我无法修复它,但我决定只手动执行,而不是调用Sequelize setter方法。它为我节省了很多时间,而且效果非常好。我只是在route handler函数中做得很好,但是如果你想让你的代码更有条理,你可以创建一个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)
    }
})

这并没有解决问题。刚才,我在generateAuthToken setter方法中尝试了console.log“hello world”,但在服务器上没有收到该消息。所以,我认为问题在于程序不能识别这个函数名。