我是Node / GraphQL / MongoDB / Moogose的新手。 我正在尝试创建一个变体,以使用bcryptjs而非纯文本对用户密码进行加密。但是,我遇到此错误: TypeError:无法读取未定义的属性“哈希”
我来自Python背景,在理解异步编程的方式时遇到了一些困难 这是我的schema.js的代码块
const RootMutation = new GraphQLObjectType({
name: 'RootMutationType',
fields: {
createUser: {
type: UserType,
args: {
email: { type: new GraphQLNonNull(GraphQLString) },
password: { type: new GraphQLNonNull(GraphQLString) },
},
resolve(parents, args) {
User.findOne({ email: args.email })
.then(user => {
if(user) {
throw new Error('This email has already been used!');
}
return bcrypt.hash(args.password, 12); // Error at this line
})
.then(hashedPassword => {
let user = new User({
email: args.email,
password: hashedPassword,
});
return user.save();
})
.catch(err => {
throw err;
});
}
}
我已经尝试过,但出现错误无法读取未定义的属性'genSalt'
createUser: {
type: UserType,
args: {
email: { type: new GraphQLNonNull(GraphQLString) },
password: { type: new GraphQLNonNull(GraphQLString) },
},
resolve(parents, args) {
User.findOne({ email: args.email })
.then(user => {
if(user) {
throw new Error('This email has already been used!');
}
bcrypt.genSalt(10, function(err, salt) {
bcrypt.hash(args.password, salt, function(err, hash) {
let user = new User({
email: args.email,
password: hash,
});
return user.save();
});
});
});
更新: 更改为以下内容后,现在可以在MongoDB中创建用户: 原来是因为我在用:
const {bcrypt} = require('bcryptjs');
代替
const bcrypt = require('bcryptjs'); // this is working
有人可以解释有什么区别吗?我正在使用ES6。
我的graphql 变异似乎也没有向我返回正确的查询。 突变cmd
mutation {
createUser(email: "test3@test.com", password: "testpassword") {
email
password
}
}
结果:
{
"data": {
"createUser": null
}
}
答案 0 :(得分:0)
const {bcrypt} = require('bcryptjs');
意味着在bcryptjs内部获取一个名为bcrypt的属性,该属性不可用。
您只进行销毁
const { isEmail } = require("validator");
当isEmail是验证器中的属性之一。
答案 1 :(得分:0)
Cannot read property 'hash' of undefined
在之后为我固定
像这样声明 bcrypt:
const bcrypt = require("bcrypt");
代替这个
const {bcrypt} = require('bcryptjs');