Используя модули Node.Js, как мне использовать объектную функцию в том же модуле? - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть модуль аутентификации с методами, которые я хотел бы использовать на сервере.Я хотел бы использовать метод rndString () как в самом модуле, так и экспортировать его для использования другими способами в приложении.Что я делаю не так, чтобы это не работало?

const crypto = require('crypto');

let sha512 = (password, salt) => {
    let hash = crypto.createHmac('sha512', salt);
    hash.update(password);
    let value = hash.digest('hex');
    return {
        salt: salt,
        passwordHash: value
    }
};

module.exports = {
    rndString: (length) => {
        return crypto.randomBytes(Math.ceil(length/2))
            .toString('hex')
            .slice(0,length);
    },
    hashId: (id) => {
        let key  = crypto.createCipher('aes-128-cbc', 'kranky');
        let hash = key.update(id, 'utf8', 'hex');
        hash += key.final('hex');
        return hash;
    },
    saltPass: (userpassword) => {
        let salt         = this.rndString(16);
        let passwordData = sha512(userpassword, salt);
        return {
            hashValue: passwordData.passwordHash,
            salt: passwordData.salt
        }
    },
    userSalt: (userpassword, salt) => {
        let passwordData = sha512(userpassword, salt);
        return passwordData.passwordHash;
    }
};

1 Ответ

0 голосов
/ 25 сентября 2018

Вы ссылаетесь на функцию rndString как this.rndString внутри функции, которая назначена клавише объекта здесь:

saltPass: (userpassword) => {
    let salt         = this.rndString(16);
    let passwordData = sha512(userpassword, salt);

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

module.exports = {
  rndString(length) {
    return crypto.randomBytes(Math.ceil(length/2))
        .toString('hex')
        .slice(0,length);
  },
  hashId(id) {
    let key  = crypto.createCipher('aes-128-cbc', 'kranky');
    let hash = key.update(id, 'utf8', 'hex');
    hash += key.final('hex');
    return hash;
  },
  saltPass(userpassword) {
    let salt         = this.rndString(16);
    let passwordData = sha512(userpassword, salt);
    return {
        hashValue: passwordData.passwordHash,
        salt: passwordData.salt
    }
  },
  userSalt(userpassword, salt) {
    let passwordData = sha512(userpassword, salt);
    return passwordData.passwordHash;
  }
}

Здесь вы можете найти хорошую документацию для краткого описания метода объекта: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...