Javascript 异步回调不可能嵌套
在node.js中定义路由时,我试图调用一些中间件来根据请求加载用户。然而,从数据库中提取用户的异步特性似乎使其不可能 使用其他功能连接到数据库的中间件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
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_duncannext()
没有“返回值”,它只是调用下一个回调函数。看起来你的应用程序在其他地方出现了错误。好的,谢谢你的回答,但它并没有像你说的那样解决问题。我试图让req.user
返回到中间件,而不需要无休止的回调链…@derek_duncan:“无休止的回调链”是什么意思?我目前正在尝试不添加另一个回调来修复此问题。你知道为什么next()
没有返回值吗?@derek_duncannext()
没有“返回值”,它只是调用下一个回调函数。您的应用程序中的其他地方似乎有错误。您希望从回调调用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