我正在尝试生成一个新令牌并将其存储在使用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()
}
})
可悲的是我没有出错。这使得调试变得如此困难。
答案 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)
}
})