#javascript #hash #bcrypt #assign #salt
#javascript #хэш #bcrypt #назначить #соль
Вопрос:
Мне нужно поменять пароли, которые находятся в открытом доступе, на те, которые хэшированы. Я использую 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:Usersmziadassignment-mziadeh1serversbcryptExample.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:Usersmziadassignment-mziadeh1serversbcryptExample.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"
}
Мне нужно, чтобы пароли заменялись хэш-кодом, поэтому я пытаюсь его назначить. Но я получаю ошибку, которую я не понимаю, и я действительно не могу определить какие-либо проблемы с моим кодом прямо сейчас.
Ответ №1:
Похоже, вы неправильно поняли, как работает функция 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]'
Как вы можете видеть, для параметра writable установлено значение false, что означает, что вы не можете переназначить каждый символ в строке. Это объясняет, почему в сообщении об ошибке говорится, что свойству ‘0’ строки ‘abc’ не может быть присвоено новое значение.
Итак, решение состоит в том, чтобы сделать student.password = passHash
вместо Object.assign(student.password, passHash);