This is my code
const bcrypt = require('bcryptjs'); const salt = bcrypt.genSalt(11); const user = { first: "Donald", last: "Trump", password : bcrypt.hash(this.password, salt), greetUser(password) { console.log(`Hi, ${this.first} ${this.last} ${this.password}`); }, }; let password = 'secondhand01'; user.greetUser(password);
I run
node --trace-warnings index.js Hi, Donald Trump [object Promise] (node:15222) UnhandledPromiseRejectionWarning: Error: Illegal arguments: undefined, object
I expected hashed password. Why does terminal point to illegal arguments?
Advertisement
Answer
In an object literal, password : bcrypt.hash(this.password, salt)
calls bcrypt.hash
and assigns its return value to the password
property. In the code you’ve shown, this
doesn’t refer to the object being created, it refers to the same thing this
refers to where the object literal is being created (the top level of the module). Since that doesn’t have a password
property, you’re passing undefined
to the function.
bcrypt.hash
also returns a promise, as you can see from the output you get before the unhandled promise rejection.
Your user
object is being populated with hardcoded values, so you may have meant to do something like this:
const bcrypt = require('bcryptjs'); const salt = bcrypt.genSalt(11); bcrypt.hash("secondhand01", salt) // <=== Encrypt the password .then(hashedPassword => { // You have it now, you can build and use the object const user = { first: "Donald", last: "Trump", password : hashedPassword, greetUser() { // Note I removed the parameter you weren't using here console.log(`Hi, ${this.first} ${this.last} ${this.password}`); }, }; user.greetUser(); // Note I removed the unused argument here }) .catch(error => { // Handle/report the error... });