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

Jer*_*rry 10 mongoose mongodb node.js 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;
                });
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经尝试过,但收到错误无法读取未定义的属性“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();
                            });
                        });
                    });
Run Code Online (Sandbox Code Playgroud)

更新: 我现在可以在更改为以下内容后在我的 MongoDB 中创建一个用户:事实证明这是因为我正在使用:

const {bcrypt} = require('bcryptjs');

代替

const bcrypt = require('bcryptjs'); // this is working

有人可以解释有什么区别吗?我正在使用ES6。

另外,我的 graphql突变似乎没有返回正确的查询。突变命令

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

Run Code Online (Sandbox Code Playgroud)

结果:

{
  "data": {
    "createUser": null
  }
}
Run Code Online (Sandbox Code Playgroud)

Zan*_*lan 25

尝试

import * as bcrypt from 'bcrypt';
Run Code Online (Sandbox Code Playgroud)

更新:当您尝试访问未定义变量的属性时,会发生 TypeError: Cannot read property 'hash' of undefined 错误。在这种情况下,您似乎在使用 bcryptjs 时尝试访问未定义变量的哈希属性。

切换到 import * as bcrypt from 'bcrypt' 之所以有效,是因为它将整个 bcrypt 模块作为对象导入,其中包括哈希函数。这意味着当您调用 bcrypt.hash() 时,将从导入的模块中调用哈希函数。


小智 0

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

const bcrypt = require("bcrypt");
Run Code Online (Sandbox Code Playgroud)

而不是这个

const {bcrypt} = require('bcryptjs');
Run Code Online (Sandbox Code Playgroud)