node.js - 调用在 Controller 中同步工作的函数 - Node

标签 node.js function asynchronous

我正在使用一个逻辑来从一个名为“Group”的实体中获取 ID,我需要从另一个名为 User 的实体中设置一个具有此值的变量。

我创建了一个函数,在 mongo 中搜索名为“admin”的文档并返回他的 id。我认为问题在于该函数是异步的,所以,我稍后才得到这个值。

这就是我想做的:

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

该函数将创建用户,但传递 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."
});
}
};

如何在不阻止处理的情况下获取 id 值?

console.log(user.groupid) 返回“undefined”,可能是因为 Node 调用函数并且在处理之前调用console.log

谢谢

最佳答案

使用回调可能是在 JavaScript(和 Node.js)中进行异步编程的最常见方法。然而,从 ES2017 开始,可以使用 Promisesasync/await 结合使用编写一些看起来像同步代码的非阻塞异步代码。

我们可以重写 getAdminId 函数,使其返回一个 Promise,而不是在回调中返回值(这无论如何都不起作用,因为在 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
   // ...
 };

关于node.js - 调用在 Controller 中同步工作的函数 - Node,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53957171/

相关文章:

google-chrome - Node.js 可以调用 Chrome 吗?

javascript - HTTP 服务器在一段时间后停止 (Node.js)

javascript - 异步ajax调用阻塞UI

javascript - for 循环内的变量给出最大值

node.js - 为什么 require ('./' ) 与具有 index.js 的模块内部的 require ('./index' ) 不一样?

java - 代码气味 : Make this anonymous inner class a lambda

php 函数参数默认值 - 如何知道 def.值被应用?

c - 如何将数组传递给函数而不在函数外部更改它?(数组不是全局的)

C# TCP Async EndReceive() 仅在 Windows XP 32 位上抛出 InvalidOperationException

ios - 异步调用后无法刷新 UI