异步回调不可能嵌套

Asynchronous Callbacks impossible nesting

本文关键字:嵌套 不可能 回调 异步      更新时间:2023-09-26

当我在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函数的回调中设置。

另一个问题可能是将hsetall()提供的Object转换为Array

for..inObject的密钥上迭代的顺序是不保证的(除了不会重复),因此玩家/用户的顺序在ps中可能会从一个转换到下一个转换而发生变化。

最好保留Object,将其密钥用作:id,并将其值从JSON转换为Object本身:

for (var k in objs)
  objs[k] = JSON.parse(objs[k]);
callback(objs);
req.user = ps[req.params.id];