如何修复TypeError:在使用bcryptjs进行GraphQL突变的哈希密码的哈希密码期间,无法读取未定义的属性“哈希”?

时间:2019-09-23 03:00:42

标签: node.js mongodb mongoose graphql

我是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
  }
}

2 个答案:

答案 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');