代码之家  ›  专栏  ›  技术社区  ›  aalaap

如何使用Node.js?

  •  0
  • aalaap  · 技术社区  · 6 年前

    我想从演示中得到一个简单的顺序输出节点.js应用程序和续集,但我似乎无法把我的头包在承诺和蓝鸟,以及如何这些可以帮助我。我想要的结果是:

    User: John Doe
        Project: "Acme Website": Sample project
        Project: "PMC Website": Sample project
    
        Total projects: 2
    
    User: Jane Doe
        Project: "ABC Website": Sample project
    
        Total projects: 1
    
    User: Jill Doe
        No projects
    
    Total users: 3
    

    我不用快递。这只是一个演示应用程序来解决所有这些问题。

    这是我的 User

    // models/user.js
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      var User = sequelize.define('User', {
        firstName: DataTypes.STRING,
        lastName: DataTypes.STRING,
        email: DataTypes.STRING
      }, {});
      User.associate = function(models) {
        // associations can be defined here
        User.hasMany(models.Project);
      };
      return User;
    };
    

    这是我的 Project 型号:

    // models/project.js
    'use strict';
    module.exports = (sequelize, DataTypes) => {
      var Project = sequelize.define('Project', {
        title: DataTypes.STRING,
        description: DataTypes.TEXT
      }, {});
      Project.associate = function(models) {
        // associations can be defined here
        Project.belongsTo(models.User);
      };
      return Project;
    };
    

    我写的代码显然不起作用:

    User.findAndCountAll().then((result) => {
      if (result.count > 0) {
        let users = result.rows;
    
        users.forEach((user, index, arr) => {
            console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>' + '\n' );
            user.getProjects().then((projects) => {
              projects.forEach((project, index, arr) => {
                console.log('\tProject: "' + project.title + '": ' + project.description + '\n');
              });
            }).then((projects) => {
              console.log('\tTotal projects: xxx'); // xxx should be the count
            });
          }
        );
    
        console.log('Total users: ' + result.count);
      } else {
        console.log('No users');
      }
    });
    

    我知道我需要用承诺,但我不知道在哪里或如何。我看了一些关于回调和 setTimeout

    我不想简单地构造一个数组或值对象,然后在最后输出它,因为它不能解决我无法理解承诺是如何工作的问题。

    编辑: 我甚至不确定我问的问题是否正确。我试图通过尝试一个同步示例来理解异步,但这可能不是实现异步的方法。我想答案在于,如果我想使用JavaScript这样的异步平台,就不应该人为地设置类似于sync的等待时间。相反,如果我们考虑上面的例子,最好运行结果并将数据收集到一个对象中,然后输出它。或者,下面@Priyank建议的方法(固定和修改)将给出准确的输出:

    User.findAndCountAll({
      include:[
        Project
      ]
    }).then(result => {    
      result.rows.forEach((user, index, arr) => {
          console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>');
    
          user.Projects.forEach((project, index, arr) => {
              console.log('\tProject: "' + project.title + '": ' + project.description);
          });
    
          console.log('\n\tTotal projects: ' + user.Projects.length + '\n');
      });
    
      console.log('\nTotal users: ' + result.count + '\n');
    }).finally(() => {
      process.exit();
    });
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   Priyank    6 年前

    用下面的代码更改代码并检查。

    User.findAndCountAll({
        include:{
            model:model.project // your project model
        }
    }).then( result => {    
        console.log( "result=====>",result);
        result.forEach((user, index, arr) => {
            console.log('User: ' + user.firstName + ' ' + user.lastName + ' <' + user.email + '>' + '\n' );
            user.project.forEach((projects, index, arr) => {
                console.log('\tProject: "' + project.title + '": ' + project.description + '\n');
            });
        }
    });
    

    Document