I’m working on a login API for travelers using Node.js (Express) and MongoDB, but it consistently takes 3 to 5 seconds to authenticate users—even with valid credentials.
I want to bring the response time below 1 second, ideally as fast as possible.
What I’ve tried:
Verified MongoDB indexes on userName, phoneNo, and email.
Used select() to limit returned fields.
Skipped validation when saving last login (validateBeforeSave: false).
Password check uses bcrypt (traveler.isPasswordCorrect()).
Tokens are generated with jsonwebtoken.
Suspected bottlenecks:
MongoDB $or query across multiple fields?
bcrypt password comparison?
Double DB calls (findOne, then findById)?
My questions:
What’s the most likely bottleneck here?
How can I profile or log the execution time of each step to pinpoint the issue?
Are there best practices to reduce login response time in a Node + Mongo + JWT stack?
Here’s my login function:
const { userName, email, phoneNo, password } = req.body;
if (!password) throw new ApiError(400, "Password is required");
if (!userName && !phoneNo && !email) throw new ApiError(400, "Username or phone number is required");
const traveler = await Traveler.findOne({
$or: [{ userName }, { phoneNo }, { email }],
});
if (!traveler) throw new ApiError(404, "Traveler does not exist");
const isPasswordValid = await traveler.isPasswordCorrect(password);
if (!isPasswordValid) throw new ApiError(401, "Invalid Traveler Password");
const { accessToken, refreshToken } = await generateAccessAndRefreshTokens(traveler._id);
traveler.lastLogin = new Date();
await traveler.save({ validateBeforeSave: false });
const loggedInTraveler = await Traveler.findById(traveler._id).select("-password -refreshToken");
const options = { httpOnly: true, secure: true };
return res
.status(200)
.cookie("accessToken", accessToken, options)
.cookie("refreshToken", refreshToken, options)
.cookie("userType", "Traveler", options)
.json(
new ApiResponse(200, {
traveler: loggedInTraveler,
accessToken,
refreshToken,
userType: "Traveler",
}, "Traveler Logged In Successfully")
);
}); ```