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

Posted

技术标签:

【中文标题】如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?【英文标题】:How to fix TypeError: Cannot read property 'hash' of undefined during hashing password for GraphQL mutation with bcryptjs? 【发布时间】:2020-01-23 02:14:07 【问题描述】:

我对 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 mutation 似乎没有返回正确的查询。 变异命令

mutation 
  createUser(email: "test3@test.com", password: "testpassword") 
    email
    password
  


结果:


  "data": 
    "createUser": null
  

【问题讨论】:

【参考方案1】:

const bcrypt = require('bcryptjs'); 表示在 bcryptjs 内部抓取一个名为 bcrypt 的属性,该属性不可用。

你只做解构 const isEmail = require("validator"); 当 isEmail 是验证器中的属性之一时。

【讨论】:

【参考方案2】:

Cannot read property 'hash' of undefined 为我修复后 像这样声明 bcrypt:

const bcrypt = require("bcrypt");

而不是这个

const bcrypt = require('bcryptjs');

【讨论】:

【参考方案3】:

对于 es6:

从'bcrypt'导入bcrypt;

【讨论】:

以上是关于如何修复 TypeError:在使用 bcryptjs 对 GraphQL 突变进行哈希密码期间无法读取未定义的属性“哈希”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NetlifyCMS 构建中修复“TypeError:childImageSharp 未定义”?

如何修复“TypeError:fsevents 不是构造函数”反应错误

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

NodeJS:如何修复不同的节点模块版本? [复制]

如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'

如何修复错误 命令引发异常:TypeError: 'Member' object is not iterable