异步回调不可能嵌套
Asynchronous Callbacks impossible nesting
当我在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..in
在Object
的密钥上迭代的顺序是不保证的(除了不会重复),因此玩家/用户的顺序在ps
中可能会从一个转换到下一个转换而发生变化。
最好保留Object
,将其密钥用作:id
,并将其值从JSON转换为Object
本身:
for (var k in objs)
objs[k] = JSON.parse(objs[k]);
callback(objs);
req.user = ps[req.params.id];
相关文章:
- 如果类不是一个选项,如何在使用 jQuery 时控制(避免)嵌套 html 元素的样式
- 嵌套到另一个函数中的Fancybox函数;不起作用
- 嵌套foreach逐字母读取值,而不是整个单词
- 获取不带Jquery的嵌套父HREF节点
- 如何使用其他地方指定的访问信息访问嵌套的json对象,而不使用eval或迭代
- 它在另一个函数中嵌套后不会输出文本
- 传递数量不确定的可能嵌套的对象属性
- 如何在嵌套函数jquery上保持变量的值不变
- Angularjs:ui路由嵌套状态下的绑定不起作用
- Chrome:如何在不嵌套的情况下将两个连续跨距插入可编辑实体中
- 截断文本而不点击嵌套链接
- 挖空.js嵌套视图模型不起作用
- 异步回调不可能嵌套
- Javascript模板-深度嵌套是可能的
- 访问全局变量的嵌套成员可能不同
- JQuery 手风琴子菜单/嵌套不起作用
- 如何与嵌套对象进行淘汰,这些对象可能不总是数组
- 检查是否存在嵌套在对象深处的函数,这些函数可能不存在
- Jquery嵌套不更新
- D3嵌套-不一致的级别数