javascript - 异步回调不可能嵌套

标签 javascript node.js asynchronous express

当我在 node.js 中定义路由时,我尝试调用一些中间件来根据请求加载用户。然而,从数据库中提取用户的异步特性似乎使其不可能。

使用其他函数连接数据库的中间件

function loadUsers (req, res, next) {
  userings.openPlayers(function(ps) {
    req.user = ps[req.params.id - 1];
  });
  console.log(req.user);
}

使用中间件的路由

app.get('/player/game/:id', loadUsers, function(res, req) {
  console.log(req.user);
});

连接数据库并在回调中返回用户的函数

function openPlayers(callback) {
  db.hgetall("players", function(err, objs) {
    var players = [];
    // Objects of Response
    for (var k in objs) {
      // Items are the individual key-value object
      var newPlayer = {};
      var items = JSON.parse(objs[k]);
      for (var x in items) {
        // x is the key for each object
        newPlayer[x] = items[x];
      }
      players.push(newPlayer);
    }
    callback(players);
  });
}
module.exports.openPlayers = openPlayers;

数据库连接功能很好用!我的具体问题是如何使用回调将用户返回到 loadUsers 函数,以便我的路由可以将其用作中间件。 谢谢!

最佳答案

不要忘记在中间件中调用next

app.use(function (req, res, next) {
  userings.openPlayers(function(ps) {
    req.user = ps[req.params.id - 1];
    next();
  });

  // this is pointless here
  // console.log(req.user);
});

req.user 仅在 openPlayers 函数的回调中设置。

关于javascript - 异步回调不可能嵌套,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452820/

相关文章:

javascript - Vue中的动态组件点击事件

node.js - mongodb 中带有 _id 字段的不同集合

node.js - Mongodb 4.0 Transactions with Mongoose 和 NodeJs, Express

javascript - 如何创建一个包含 n 个字符的字符串?如何创建具有特定长度的字符串?

javascript - 使用 html 5 范围 slider 更改 openlayer 3 圆半径

javascript - 如何将 Array.forEach 转换为与 Q.js 异步?

JavaScript开发: When do you prefer sync over async?

javascript - NodeJs,api路由返回后异步函数是否完成

javascript - 查明嵌套的 ng-repeat 是否显示任何内容

node.js - 设置 "firebase javascript"与 "ionic serve"一起使用