0

I want my function to return true or false but it seems to be returning false each time

function alreadyExist(login) {
   User.findOne({login: login}, (error, user) => {
    return (!error && user);
  });
}

logRoute.post('/register', (req, res) => {
    let userData = req.body;
    let user = new User(userData);
    let login = user.login;
    let number = 0;
    while (alreadyExist(login)){
      number +=1;
      login = user.login+number.toLocaleString(undefined, {minimumIntegerDigits: 2});
    }
    if(number>0)user.login = login;
    user.save((err, registeredUser) => {
      if (err) {
        console.log(err)
      } else {
        console.log("registered\n" + registeredUser);
        res.status(200).send('user registered')
      }
    });
  }
);

my code is supposed to add a digit after the user login if a user with the same login already exist but my code only add multiple user with the same login in my database, do you know why ?

lolozen
  • 386
  • 1
  • 4
  • 19

1 Answers1

0

the issue was my first function being asynchronous here's how I solved it following this other post How do I return the response from an asynchronous call?

I made the function returning a promise and my while loop await this asynchronous function by making the callback in which it was standing asynchronous too

function alreadyExist(login) {
  return new Promise(((resolve, reject) => {
    User.findOne({login: login}, (error, user) => {
      if(!error && user) resolve(true);
      else if(!error && !user) resolve(false);
      else if(error) reject(error);
    });
  }))

}

logRoute.post('/register', async (req, res) => {
    let userData = req.body;
    let user = new User(userData);
    let login = user.login;
    let number = 0;
    while (await alreadyExist(login)){
      number +=1;
      login = user.login+number.toLocaleString(undefined, {minimumIntegerDigits: 2});
    }
    if(number>0)user.login = login;
    user.save((err, registeredUser) => {
      if (err) {
        console.log(err)
      } else {
        console.log("registered\n" + registeredUser);
        res.status(200).send('user registered')
      }
    });
  }
);
lolozen
  • 386
  • 1
  • 4
  • 19