使用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:\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"

  }

我需要将密码与哈希码交换,因此为什么要尝试分配密码。但是我遇到了一个我不理解的错误,我现在无法真正发现我的代码有任何问题。


九州编程
浏览 193回答 1
1回答

桃花长相依

似乎您误解了Object.assign函数的工作方式。Object.assign函数的作用是遍历源参数的每个属性(第一个参数之后的参数),并在第一个参数中覆盖它。您的示例中的问题是您尝试使用String作为其参数调用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',&nbsp; writable: false,&nbsp; enumerable: true,&nbsp; configurable: false }*/Object.assign('abc', 'def');// throws Cannot assign to read only property '0' of object '[object String]'如您所见,writable设置为false,这意味着您无法重新分配字符串中的每个字符。这解释了为什么错误消息说字符串'abc'的属性'0'不能分配新值。所以解决方案是做student.password = passHash而不是Object.assign(student.password, passHash);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript