«Путь 'hashed_password' обязателен», хотя поле hash_password заполнено при использовании виртуального поля - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь создать приложение, в котором пароль отправляется в виртуальное поле, затем хэшируется и сохраняется как ha sh. Однако я продолжаю получать эту ошибку:

(node:32101) UnhandledPromiseRejectionWarning: ValidationError: User validation failed: hashed_password: Path `hashed_password` is required.

Ниже приведен мой код, и при его запуске я получаю журналы, включенные под кодом.

const mongoose = require('mongoose');
const uuidv1 = require('uuid/v1');
const cryptop = require('crypto');

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        trim: true,
        required: true
    },
    email: {
        type: String,
        trim: true,
        required: true
    },
    hashed_password: {
        type: String,
        required: true
    },
    salt: String,
    created: {
        type: Date,
        default: Date.now
    },
    updated: Date
});

userSchema
    .virtual("password")
    .set(password => {
        // create temporary variable called _password
        this._password = password;
        // generate a timestamp
        this.salt = uuidv1();
        // encryptPassword()
        this.hashed_password = this.encryptPassword(password);
        console.log(this);
    })
    .get(function () {
        return this._password;
    });

userSchema.methods = {
    encryptPassword: password => {
        if (!password) return "";
        try {
            return crypto
                .createHmac("sha1", this.salt)
                .update(password)
                .digest("hex");
        } catch (err) {
            return "";
        }
    }
};

module.exports = mongoose.model("User", userSchema);

Ошибка:

Express is listening on port 8080
DB connected
{ name: 'Ryan', email: 'ryan1@gmail.com', password: 'rrrrr' }
(node:32477) UnhandledPromiseRejectionWarning: TypeError: this.encryptPassword is not a function

Когда я делаю это без функции encryptPassword, я все равно получаю сообщение об ошибке:

const mongoose = require('mongoose');
const uuidv1 = require('uuid/v1');
const cryptop = require('crypto');

const userSchema = new mongoose.Schema({
    name: {
        type: String,
        trim: true,
        required: true
    },
    email: {
        type: String,
        trim: true,
        required: true
    },
    hashed_password: {
        type: String,
        required: true
    },
    salt: String,
    created: {
        type: Date,
        default: Date.now
    },
    updated: Date
});

userSchema
    .virtual("password")
    .set(password => {
        // create temporary variable called _password
        this._password = password;
        // generate a timestamp
        this.salt = uuidv1();
        // encryptPassword()
        // this.hashed_password = this.encryptPassword(password);
        this.hashed_password = 'Test hash';
        console.log(this);
    })
    .get(function () {
        return this._password;
    });

userSchema.methods = {
    encryptPassword: password => {
        if (!password) return "";
        try {
            return crypto
                .createHmac("sha1", this.salt)
                .update(password)
                .digest("hex");
        } catch (err) {
            return "";
        }
    }
};

module.exports = mongoose.model("User", userSchema);

Ошибка:

Express is listening on port 8080
DB connected
{ name: 'Ryan', email: 'ryan1@gmail.com', password: 'rrrrr' }
{
  _password: 'rrrrr',
  salt: 'ff790ca0-34f0-11ea-9394-a53427d4f6bb',
  hashed_password: 'Test hash'
}
(node:32577) UnhandledPromiseRejectionWarning: ValidationError: User validation failed: hashed_password: Path `hashed_password` is required.

1 Ответ

2 голосов
/ 12 января 2020

Попробуйте использовать function(password) вместо password =>.

Когда вы используете функцию стрелки, this не ссылается на пользователя, которого вы сохраняете, поэтому вы не видите имя и по электронной почте, когда вы консоль журнала.

...