Мангуст возвращает «новый объект(«//id»)» вместо просто идентификатора

#node.js #mongodb #mongoose

Вопрос:

Я пытаюсь выполнить свою функцию входа в систему (я использую bcrypt и jsonwebtoken) проблема в том , что console.log (user._id) возвращает мне «новый объект (» 6148f043ebbaa0ab41ac8499 «)» вместо просто «6148f043ebbaa0ab41ac8499», что было бы проще для создания токена.

   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!!!" });
      }
    };
 

Как это исправить, пожалуйста?

Ответ №1:

Это нормальное поведение. Поскольку у вас есть an ObjectId , вы можете преобразовать его в строку, вызвав соответствующий toHexString() метод. Я также изменил код для проверки на наличие неопределенного пользователя и удалил дополнительный вызов для поиска пользователя, поскольку вы уже сделали это в предыдущей строке. Пожалуйста, ознакомьтесь с обновленным кодом:

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

Комментарии:

1. Это работает, и я должен признаться, что ваш код намного красивее моего, лол. Большое спасибо !