为了账号安全,请及时绑定邮箱和手机立即绑定

使用bcrypt和对象分配进行密码哈希

使用bcrypt和对象分配进行密码哈希

九州编程 2021-03-28 15:08:56
我需要将明确的密码交换为散列的密码。我正在使用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.jsC:\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"  }我需要将密码与哈希码交换,因此为什么要尝试分配密码。但是我遇到了一个我不理解的错误,我现在无法真正发现我的代码有任何问题。
查看完整描述

1 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

似乎您误解了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',

  writable: false,

  enumerable: true,

  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);


查看完整回答
反对 回复 2021-04-08
  • 1 回答
  • 0 关注
  • 192 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信