Home > database >  Mongoose return "new ObjectId("//id")" instead of just the id
Mongoose return "new ObjectId("//id")" instead of just the id

Time:09-22

I am trying to do my login function (I am using bcrypt and jsonwebtoken) the problem is that console.log (user._id) returns me "new ObjectId (" 6148f043ebbaa0ab41ac8499 ")" instead of just "6148f043ebbaa0ab41ac8499" , which would be easier for the creation of the token.

  module.exports.login = async (req, res) => {
     const { email, password } = req.body;
    
      // Compare the req.body.password to the hashed password in DB
      const user = await UserModel.findOne({ email: email });
      const match = await bcrypt.compare(password, user.password);
    
      if (match) {
        try {
          const user = await UserModel.findOne({ email: email });
          console.log(user._id);
    
          // Assign a token
          const token = jwt.sign({ userId: user._id }, process.env.LOGIN_TOKEN, {
            expiresIn: "1h",
          });
          console.log(token);
          res.cookie("jwt", token, { httpOnly: true});
          res.status(200).json({ user: user._id });
        } catch (err) {
          res.status(500).json(err);
        }
      } else {
        res.status(500).json({ message: "error!!!" });
      }
    };

How to fix this please?

CodePudding user response:

That is a normal behaviour. Since you got an ObjectId, you can convert it to a string by calling the toHexString() method on it. I have also modified the code to check for an undefined user, and removed the extra call to find a user since you already did in the previous line. Please see updated code:

module.exports.login = async (req, res) => {
  const { email, password } = req.body;
   const user = await UserModel.findOne({ email: email });

   if (!user) {
     return res.status(400).json({ message: "Unauthorised"});
   }
 
   // Compare the req.body.password to the hashed password in DB
   const match = await bcrypt.compare(password, user.password);
 
   if (match) {
     try {
      //  Convert user id (ObjectId) to a string
       const userId = user._id.toHexString();
      //  Now user id is a string
       console.log(userId);
 
       // Assign a token
       const token = jwt.sign({ userId }, process.env.LOGIN_TOKEN, {
         expiresIn: "1h",
       });
       console.log(token);
       res.cookie("jwt", token, { httpOnly: true});
       res.status(200).json({ user });
     } catch (err) {
       res.status(500).json(err);
     }
   } else {
     res.status(400).json({ message: "Unauthorised" });
   }
 };
  • Related