【问题标题】:Sequelize asincronously mapping resultsSequelize asincronously 映射结果
【发布时间】:2014-02-27 22:48:29
【问题描述】:

我正在开发一个带有角度前端和在 nodejs 中开发的 restfull 后端的项目。 该项目使用现有的 MySQL 数据库。我使用 sequelizejs orm 连接 node 和 mysql。

在数据库中有 2 个实体:用户和项目。一个项目有很多用户(称为工人)

Project.findAll().success(function(projects) {

     var array=[];
     projects.forEach(function(project) {

         project.getWorkers().success(function(users) {
              project.workers=users;
              console.log('a');
         });
         console.log('b');
         array.push(project);

     });

     console.log('c');
         res.json(array);
     });

Sequelize 工作正常。它返回所有项目,getWorkers 返回该项目的正确用户。

有什么问题? 问题是 asincronously 调用,在发送响应后调用 getWorkers。这是不正确的。在发送结果之前,我需要在每个项目中添加工作人员。 console.log 说:b b b c a a a a a a a (“c”是在“a”getWorkers之前调用的json响应。正确的方法是:b a a b a a a a b a c

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    您有两个选择:您可以稍微修改现有代码以仅在所有 getWorkers 调用成功后才返回,或者您可以使用预先加载来一次性获取项目和工作人员:

    选项 1

    Project.findAll().success(function(projects) {
    
        var array =[],
            done = _.after(projects.length, function () {
                res.json(array);
            });
    
        projects.forEach(function (project) {
             project.getWorkers().success(function(users) {
                  project.workers = users;
                  done();
             });
             array.push(project);
        });
    });
    

    _.done创建一个函数,在调用了 projects.length 次后调用 res.json。如果您的项目中还没有下划线/lodash,您可以使用Sequelize.Utils._.after

    选项 2

    Project.findAll({
        include: [
            { model: User, as: 'Workers' }
       ]
    }).success(function (projects) {
        // project.workers is already populated here
    })
    

    【讨论】:

    • 终于哇!!选项2有效!通过表 user_project 多对多。非常感谢 Jan。这两种解决方案都很有趣。
    猜你喜欢
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    相关资源
    最近更新 更多