am尝试使用graphql登录,我想首先检查数据库中是否存在电子邮件,然后,如果电子邮件存在,则我将密码与密码中的bcrypt哈希进行比较,如果返回true ,那么我将更新数据库中用户表中的令牌,但是当我对此进行测试时
mutation {
loginUser(user: {email: "kmd@vh.id", password: "1345968"}) {
password
}
}
它在数据库中返回了该令牌而不是te令牌
mutation {
loginUser(user: {email: "kmd@vh.id", password: "1345968"}) {
token
}
}
这是我的代码
import models from '../../../models/index.js';
import User from '../../types/user.js';
import UserInput from '../../inputs/user.js';
const jwt = require('jsonwebtoken')
const bcrypt = require('bcryptjs')
require('dotenv').config()
const fs = require('fs');
const path = require('path');
var privateKey = fs.readFileSync(path.join(__dirname, '../../key/private.key'), 'utf8');
export default {
type: User,
args: {
user: {
type: UserInput
}
},
resolve (_,args) {
return models.user.findOne({
where: {email: args.user.email}
}).then((fUser)=> {
bcrypt.compare(args.user.password, fUser.password, function (err, res) {
if (res) {
return models.user.findById(fUser.id).then((user) => {
return user.update({ token: jwt.sign({id:fUser.id, role:fUser.role, email:fUser.email}, privateKey, { expiresIn: '1h' }) });
});
} else {
console.log(err+" error")
}
})
});
}
};
请让我返回令牌
答案 0 :(得分:0)
尝试将findByIdAndUpdate
与{new: true}
一起使用来更新文档。所以您的代码将是这样
return models.user.findOne({
where: {email: args.user.email}
}).then((fUser)=> {
bcrypt.compare(args.user.password, fUser.password, function (err, res) {
if (res) {
return models.user.findByIdAndUpdate(fUser.id, {
$set: {
token: jwt.sign(
{ id:fUser.id, role:fUser.role, email:fUser.email },
privateKey,
{ expiresIn: '1h' }
)}}, { new: true })
} else {
console.log(err+" error")
}
})
});