Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步回调不可能嵌套_Javascript_Node.js_Asynchronous_Express - Fatal编程技术网

Javascript 异步回调不可能嵌套

Javascript 异步回调不可能嵌套,javascript,node.js,asynchronous,express,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

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

不要忘记调用中间件中的
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
函数的回调中设置。

另一个问题可能是将
对象
转换为
数组

for..in
对象的键上迭代的顺序不能保证(除了它不会重复之外),因此玩家/用户的顺序可能会在
ps
中从一次转换到下一次

最好保留
对象
,将其键用作
:id
,并将其值从JSON转换为
对象本身:

for (var k in objs)
  objs[k] = JSON.parse(objs[k]);

callback(objs);

另一个问题可能是将
对象
转换为
数组

for..in
对象的键上迭代的顺序不能保证(除了它不会重复之外),因此玩家/用户的顺序可能会在
ps
中从一次转换到下一次

最好保留
对象
,将其键用作
:id
,并将其值从JSON转换为
对象本身:

for (var k in objs)
  objs[k] = JSON.parse(objs[k]);

callback(objs);


好的,谢谢你的回答,但它不能像你说的那样解决问题。我试图让
req.user
返回到中间件,而不需要无休止的回调链…@derek_duncan:“无休止的回调链”是什么意思?我目前正在尝试不添加另一个回调来修复此问题。你知道为什么
next()
没有返回值吗?@derek_duncan
next()
没有“返回值”,它只是调用下一个回调函数。看起来你的应用程序在其他地方出现了错误。好的,谢谢你的回答,但它并没有像你说的那样解决问题。我试图让
req.user
返回到中间件,而不需要无休止的回调链…@derek_duncan:“无休止的回调链”是什么意思?我目前正在尝试不添加另一个回调来修复此问题。你知道为什么
next()
没有返回值吗?@derek_duncan
next()
没有“返回值”,它只是调用下一个回调函数。您的应用程序中的其他地方似乎有错误。您希望从回调调用
next()
req.user
仍然从路由返回
undefined
。我检查了一个已确认返回预期值的文件。经过几个小时的调试,我对这个问题感到困惑。我不知道。我应该在它之前加上吗?@derek_duncan不,对不起。您可以忽略我之前关于
app.use()
的评论。我只是误读了问题的一部分。您想从回调调用
next()
req.user
仍然从路由返回
undefined
。我检查了一个已确认返回预期值的数据库。经过几个小时的调试,我对这个问题感到困惑。我不知道。我应该在它之前加上吗?@derek_duncan不,对不起。您可以忽略我之前关于
app.use()
的评论。我只是误读了问题的一部分。+1是一个更好的方法,但问题仍然没有解决。即使使用
next()
@derek\u duncan,路由似乎也无法从回调返回用户对象,您希望结果出现在哪里?根据代码段,用户应该登录到STDOUT。但是,如果您希望它出现在HTTP客户端(浏览器)中,则需要使用。您还可以使用Express',这是其他两种方法的简写。如果我在
loadUsers
函数中调用它,它就会起作用。有没有办法从
应用程序调用它。改为获取
路径,就像我最初使用
控制台.log进行测试一样?如果你用最后一条评论编辑你的答案,我将标记为答案。它可以工作,我只是希望我可以从
loadUsers
+1中的回调函数调用它,以获得更好的方法,但问题仍然没有解决。即使使用
next()
@derek\u duncan,路由似乎也无法从回调返回用户对象,您希望结果出现在哪里?根据代码段,用户应该登录到STDOUT。但是,如果您希望它出现在HTTP客户端(浏览器)中,则需要使用。您还可以使用Express',这是其他两种方法的简写。如果我在
loadUsers
函数中调用它,它就会起作用。有没有办法从
应用程序调用它。改为获取
路径,就像我最初使用
控制台.log进行测试一样?如果你用最后一条评论编辑你的答案,我将标记为答案。它可以工作,我只是希望我可以从
loadUsers