Возможна ли проверка, существует ли запись синхронно?

#node.js #mongodb #express #mongoose

#node.js #mongodb #выразить #мангуст

Вопрос:

В принципе, я хочу сохранить a user внутри базы данных, перед выполнением этой операции мне нужно проверить поля этого user . Итак, у меня есть эта структура:

 exports.save = function(req, res)
{
   let errors = validate(req.body);

   if(!errors.length)
   {
       //add user
       res.status(200).send(true);
   }
   else{
       res.status(500).send("oh bad");
   }
};

function validate(user)
{
   let errors = [];

   if (User.findOne({ email: user.email })) {
      errors.push({ msg: 'Email already registered!' });
   }
} 
  

приведенный выше код просто не может работать, потому что NodeJS обрабатывает операцию асинхронно. Я могу исправить эту «проблему», выполнив что-то вроде:

 User.findOne({ email: email }).then(user => {
  if (!user) {
    //add user
    res.status(200).send(true);
 });
  

но я хочу добавить проверку внутри функции validate , есть ли способ сделать это? Извините, если этот вопрос может показаться глупым, но я новичок в NodeJS

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

1. @NikKyriakides Я знаю, как это сделать в обратном вызове javascript, я просто хочу знать, как это сделать в mongoose

2. Прошу прощения. Удаление.

3. @NikKyriakides нет проблем 🙂

4. @sfarzoso, если вы новичок в Node (и javascript в целом), вы должны понимать, что асинхронность — это особенность, а не проблема.

5. @MattKuhns Я знаю javascript, я просто новичок в Node 🙂 Мне действительно нравится технология Node

Ответ №1:

Поскольку ничто по своей сути не делает exports.save синхронным, вероятно, проще всего сделать validate асинхронным (и давайте также сделаем это современным, используя promises и async ).

 exports.save = async function(req, res) {
  const errors = await validate(req.body);

  if (!errors.length) {
    //add user
    res.status(200).send(true);
  } else {
    res.status(500).send("oh bad");
  }
};

async function validate(body) {
  const errors = [];
  const user = await User.findOne({ email: body.email });
  if (user) {
    errors.push({ msg: "Email already registered!" });
  }
  return errors;
}
  

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

1. Другими словами, вы не можете сделать это в строго синхронном смысле.

2. Да, и это хорошо. В конце концов, синхронные операции в Node.js серверное приложение заблокирует его от обслуживания других запросов, поскольку узел является однопоточным.