I am getting an error after trying to use the POST
method through postman
to register a user. I have created a simple Schema
for the register
route.
Error:
Error in register: Error: User validation failed: password: Cast to string failed for value "Promise { <pending> }" (type Promise) at path "password"
at ValidationError.inspect (/Users/*****/authSystem/node_modules/mongoose/lib/error/validation.js:48:26)
at formatValue (node:internal/util/inspect:782:19)
at inspect (node:internal/util/inspect:347:10)
at formatWithOptionsInternal (node:internal/util/inspect:2167:40)
at formatWithOptions (node:internal/util/inspect:2029:10)
at console.value (node:internal/console/constructor:324:14)
at console.log (node:internal/console/constructor:360:61)
at /Users/harshmishra/Desktop/BackendApp/authSystem/app.js:46:17
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
errors: {
password: CastError: Cast to string failed for value "Promise { <pending> }" (type Promise) at path "password"
at SchemaString.cast (/Users/*****/authSystem/node_modules/mongoose/lib/schema/string.js:600:11)
at SchemaString.SchemaType.applySetters (/Users/*****/authSystem/node_modules/mongoose/lib/schematype.js:1189:12)
at model.$set (/Users/***/authSystem/node_modules/mongoose/lib/document.js:1409:20)
at model.$set (/Users/*****/authSystem/node_modules/mongoose/lib/document.js:1137:16)
at model.Document (/Users/****/authSystem/node_modules/mongoose/lib/document.js:162:12)
at model.Model (/Users/****/authSystem/node_modules/mongoose/lib/model.js:115:12)
at new model (/Users/*****/authSystem/node_modules/mongoose/lib/model.js:4825:15)
at /Users*****/authSystem/node_modules/mongoose/lib/model.js:3132:22
at /Users/*****/authSystem/node_modules/mongoose/lib/model.js:3168:7
at Array.forEach (<anonymous>) {
stringValue: '"Promise { <pending> }"',
messageFormat: undefined,
kind: 'string',
value: [Promise],
path: 'password',
reason: null,
valueType: 'Promise'
}
},
_message: 'User validation failed'
}
Schema:
const userSchema = new mongoose.Schema(
{
firstName: {
type: String,
default: null,
},
lastName: {
type: String,
default: null,
},
email: {
type: String,
unique: true,
},
password: {
type: String,
},
token: {
type: String,
},
},
);
module.exports = mongoose.model('User', userSchema)
/register:
app.post("/register", async(req, res) => {
try {
const { firstName, lastName, email, password } = req.body;
if (!(firstName && lastName && email && password)) {
res.status(400).send("All fields are required");
}
const existingUser = await User.findOne({ email });
if (existingUser) {
res.send(401).send("User already exist");
}
const myEncrpytedPass = bcryptjs.hash(password, 10);
const user = await User.create({
firstName,
lastName,
email: email.toLowerCase(),
password: myEncrpytedPass,
});
const token = jwt.sign(
{
user_id: user._id,
email,
},
process.env.SECRET_KEY,
{
expiresIn: "4h",
}
);
user.token = token;
res.status(201).json(user);
} catch (error) {
console.log("Error in register:",error)
}
})
I am not able to figure out what I am doing wrong here? As I have followed the docs of a mongoose but still I am getting the error.
What changes should I make here?
CodePudding user response:
Try adding await
before the bcryptjs.hash()
. Looks like that function returns a Promise.
const myEncrpytedPass = await bcryptjs.hash(password, 10);
CodePudding user response:
app.post("/register", async(req, res) => {
try {
const { firstName, lastName, email, password } = req.body;
if (!(firstName && lastName && email && password)) {
res.status(400).send("All fields are required");
}
const existingUser = await User.findOne({ email });
if (existingUser) {
res.send(401).send("User already exist");
}
const myEncrpytedPass = await bcryptjs.hash(password, 10);
const user = await User.create({
firstName,
lastName,
email: email.toLowerCase(),
password: myEncrpytedPass,
});
const token = await jwt.sign(
{
user_id: user._id,
email,
},
process.env.SECRET_KEY,
{
expiresIn: "4h",
}
);
user.token = token;
res.status(201).json(user);
} catch (error) {
console.log("Error in register:",error)
}
})
You need to await jwt sign and bcrypt