Вызов функции, которая работает синхронно в контроллере - Node - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю в логике, чтобы забрать ID у сущности с именем «Group», мне нужно установить переменную из другой сущности, с именем User, с этим значением.

Я создал функцию, которая ищет в монго документ с именем «admin» и возвращает его идентификатор.Я думаю, проблема в том, что функция асинхронная, поэтому я получаю это значение только позже.

Вот что я пытаюсь сделать:

function getAdminId() {
 Group.findOne(
  {
   name: "admin"
  },
  function(err, admin){
   if(err){
    console.log("Erro ao pegar o ID do admin");
   }else{
    return admin._id;
   }
  }
 )
};

Функция, которая создаст пользователя,но передавая значение для идентификатора

exports.register = function(req, res, next) {

// Verifica se a chave digitada existe no banco de dados.
if (req.company) {
 var user = new User(req.body);
 var message = null;
 user.provider = "local";
 user.username = usernameGenerator.generateUsername("-");
 user.password = generator.generate({
  length: 8,
  numbers: true
 });
 user.name = "admin";

 // Pegar o id do grupo de admin
 user.groupid = getAdminId();
 console.log(user.groupid); // <--------- HERE'S WHERE IM TROUBLE

 // Chamar a função que envia o e-mail para o usuário.
 console.log("Usuário: " + user.username + " Senha: " + 
 user.password);

 user.save(function(err) {
  if (err) {
    message = getErrorMessage(err);
    req.flash("error", message);
    return res.redirect("/");
  } else {
    res.json({
      message: "Cadastrado."
    });
  }
 });
} else {
res.json({
  message: "Chave não encontrada."
});
}
};

Как я могу получить значение идентификатора, не блокируя мою обработку?

console.log (user.groupid) возвращает "undefined", вероятно, потому чтовызов функции узла и перед вызовом процесса console.log

Спасибо

1 Ответ

0 голосов
/ 28 декабря 2018

Использование обратных вызовов, вероятно, является наиболее распространенным способом асинхронного программирования в JavaScript (и Node.js).Однако, начиная с ES2017, можно использовать Promises в сочетании с async / await для написания некоторого асинхронного кода без блокировки, который выглядит как синхронный код.

Мы можемпереписать функцию getAdminId, чтобы она возвращала обещание, а не возвращала значения в обратном вызове (который не работает в любом случае, потому что в программировании CPS возвращаемые значения в обратных вызовах не имеют значения):

function getAdminId() {
  return new Promise(function(resolve, reject) {
    Group.findOne({
        name: "admin"
      },
      function(err, admin) {
        if (err) {
          reject(new Error("Erro ao pegar o ID do admin"));
        } else {
          resolve(admin._id);
        }
      }
    );
  });
}

Тогда вы можетесделайте ваш реестр промежуточным программным обеспечением асинхронным и сделайте что-то вроде:

 exports.register = async function (req, res, next) { // notice the async keyword
   // ...
   user.groupid = await getAdminId(); // notice the await keyword
   // ...
 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...