Хеширование пароля с bcrypt и присвоение объекта - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно поменять пароли от простого к хешированному.Я использую bcryptjs, чтобы помочь мне с этим.

Я попытался назначить пароли, которые находятся в незашифрованных паролях, но я получаю сообщение об ошибке на моем bash.

Мой код, который япытаюсь заставить работать:

const bcrypt = require('bcryptjs');
const students = require('./students1.json');
const fs = require('fs');

let secureUsers = [];
for (let student of students) {
    let salt = bcrypt.genSaltSync(10);
    let passHash = bcrypt.hashSync(student.password, salt);
    Object.assign(student.password, passHash);
    secureUsers.push(secStudent);
}
fs.writeFileSync('secStudents.json', JSON.stringify(secureUsers, null, 2));
console.log('wrote file!');

Ошибка, которую я получаю:

$ node bcryptExample.js
C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13
    Object.assign(student.password, passHash);
           ^

TypeError: Cannot assign to read only property '0' of object '[object String]'
    at Function.assign (<anonymous>)
    at Object.<anonymous> (C:\Users\mziad\assignment-mziadeh1\servers\bcryptExample.js:13:12)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

Пример того, что я хочу хешировать:

{
    "netid": "ky4531",
    "firstName": "Frankie",
    "lastName": "Griffith",
    "email": "erasement1803@outlook.com",
    "password": "t'|x/)$g"
  },
  {
    "netid": "tw0199",
    "firstName": "Julietta",
    "lastName": "Vargas",
    "email": "ezekiel1960@outlook.com",
    "password": "Rc*pKe$w"
  }

IНужно поменять пароли на хеш-код, поэтому я и пытаюсь его назначить.Но я получаю сообщение об ошибке, которого не понимаю, и сейчас не могу обнаружить проблем с моим кодом.

1 Ответ

1 голос
/ 28 марта 2019

Похоже, вы неправильно поняли, как работает функция Object.assign. Функция Object.assign проходит через каждое свойство исходных аргументов (аргументов после первого аргумента) и перезаписывает его в первом аргументе.

Проблема в вашем примере заключается в том, что вы пытались вызвать Object.assign со строкой в ​​качестве аргументов Object.assign('abc', 'def'). Строковый литерал в JavaScript на самом деле представляет собой массив символов и массив в объекте с индексами в качестве свойств. По умолчанию свойства строки (индексы) не могут быть переназначены (доступное для записи: false).

Вот демонстрация:

var a = 'abc';
console.log(a[0]) // outputs 'a'

var descriptor = Object.getOwnPropertyDescriptor(a, 0)
console.log(descriptor)
//outputs
/*
{ value: 'a',
  writable: false,
  enumerable: true,
  configurable: false }
*/

Object.assign('abc', 'def');// throws Cannot assign to read only property '0' of object '[object String]'

Как видите, для параметра writeable установлено значение false, что означает, что вы не можете переназначить каждый символ в строке. Это объясняет, почему в сообщении об ошибке говорится, что свойству '0' строки 'abc' нельзя присвоить новое значение.

Таким образом, решение состоит в том, чтобы сделать student.password = passHash вместо Object.assign(student.password, passHash);

...