1

我刚刚使用 node.js 开始了一个大型项目,并且偶然发现了一些回调噩梦问题。我之前做过一些 node.js 开发,但只是基于教程的小东西。

我有一个用户模型和一个所有者模型,谁是该用户的所有者......基本上我在 node.js 中构建的部分将是一个 REST 服务,所以我需要发送一个包含用户及其所有者名称的 json。我的问题是尝试像在 ruby​​ 或 php 中那样获取所有者名称并将其设置为属性..但它不起作用。

人们如何在 node.js 中处理这种需要更改回调函数中的对象的逻辑?我也不希望它影响性能。

我使用 mysql 作为数据库,因为这是一个要求。所以代码是这样的:

//find all 
req.models.users.find({
    'id' : req.query.id
}, function(err, users) {
    if (err) console.log(err); //do something better here
    else {
        var json = [];
        users.forEach(function(user) {
            user.getOwner(function(err, owner) {
                user.accountOwner = owner.name;

                json.push(user;
            });    
        });

        res.type('application/json');
        res.send(json);
    }
});

我想发送这样的内容: [{ 'id': user.id, 'username": user.username, 'email': user.email, 'owner': user.owner.name' }, {... }]

4

1 回答 1

2

问题是您不了解节点代码的控制流程。它不会按时间顺序从上到下逐行排列。所以你的问题是res.send(json)在你的回调执行之前(及时)发生user.getOwner,所以你发送你的空json,然后在它已经发送之后将它塞进json数组中。您需要使用类似的东西async.each来进行连接,等待所有用户的所有者都被填充,然后发送响应。或者您实际上可以通过编写 SQL 连接而不是对您的数据库执行 N+1 查询来让数据库连接数据。

于 2013-07-25T08:10:33.720 回答