Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何配置sequelize以一对多关联方式返回嵌入式阵列?_Node.js_Express_Sequelize.js - Fatal编程技术网

Node.js 如何配置sequelize以一对多关联方式返回嵌入式阵列?

Node.js 如何配置sequelize以一对多关联方式返回嵌入式阵列?,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,交易如下: 我有两种型号-用户和房屋 用户有很多房子 房子属于使用者 我输入了一些虚拟数据,并创建了一个最小的express应用程序来提供api 我想返回一个用户列表,并包括每个用户 api端点如下所示: router.get('/users', function(req, res,next) { models.User.findAll({ include: [ models.House ], raw: true // returns result-set as a

交易如下:

我有两种型号-用户和房屋
用户有很多房子
房子属于使用者

我输入了一些虚拟数据,并创建了一个最小的express应用程序来提供api
我想返回一个用户列表,并包括每个用户

api端点如下所示:

router.get('/users', function(req, res,next) {
  models.User.findAll({
      include: [ models.House ],
      raw: true // returns result-set as a clean json...
  })
  .then(function(users) {
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});
Sequelize的默认行为是返回同一用户数据的多个实例,每次使用不同的房屋数据,如下所示:

[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 1,
    Houses.description: "house 1 desc",
    Houses.user_id: 1
  },
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 3,
    Houses.description: "house 3 desc",
    Houses.user_id: 1
  },
  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses.id: 2,
    Houses.description: "house 2",
    Houses.user_id: 2
  }
]
[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses:[
       {
          id: 1,
          description: "house 1 desc",
          user_id: 1
       },
       {
          id: 3,
          description: "house 3 desc",
          user_id: 1
       },
    ]
  },

  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses:[
       {
          id: 2,
          description: "house 2",
          user_id: 2
       }
    ]
  }
]
我可以在拥有的用户中嵌入一组房屋吗?
有没有办法将Sequelize配置为返回如下数据:

[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 1,
    Houses.description: "house 1 desc",
    Houses.user_id: 1
  },
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses.id: 3,
    Houses.description: "house 3 desc",
    Houses.user_id: 1
  },
  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses.id: 2,
    Houses.description: "house 2",
    Houses.user_id: 2
  }
]
[
  {
    id: 1,
    first_name: "aa",
    last_name: "aaaaaa",
    email: "aa@aa.aa",
    Houses:[
       {
          id: 1,
          description: "house 1 desc",
          user_id: 1
       },
       {
          id: 3,
          description: "house 3 desc",
          user_id: 1
       },
    ]
  },

  {
    id: 2,
    first_name: "bb",
    last_name: "bbbbbb",
    email: "bb@bb.bb",
    Houses:[
       {
          id: 2,
          description: "house 2",
          user_id: 2
       }
    ]
  }
]
如果答案是否定的,您能推荐一种将数据解析成这种结构的方法吗

用户模型:

module.exports = function(sequelize, DataTypes) {

  var User = sequelize.define('User', {

        first_name: DataTypes.STRING,
        last_name: DataTypes.STRING,
        email: DataTypes.STRING

    }, 
    {
      classMethods: {
        associate: function(models) {
          User.hasMany(models.House)
        }
      }
  });

  return User;
};
房屋模型:

module.exports = function(sequelize, DataTypes) {
  var House = sequelize.define("House", {
      description: DataTypes.TEXT
  }, 
  {
    classMethods: {
      associate: function(models) {
        House.belongsTo(models.User);
      }
    }
  });

  return House;
};

尝试将“as”选项添加到用户->房屋1:n关系中

module.exports = function(sequelize, DataTypes) {

      var User = sequelize.define('User', {

            first_name: DataTypes.STRING,
            last_name: DataTypes.STRING,
            email: DataTypes.STRING

        }, 
        {
          classMethods: {
            associate: function(models) {
              User.hasMany(models.House, {as: 'houses'})
            }
          }
      });

      return User;
    };
并相应地更新查询

router.get('/users', function(req, res,next) {
  models.User.findAll({
      include: [ {model: models.House, as: 'houses'} ],
      raw: true // returns result-set as a clean json...
  })
  .then(function(users) {
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});

我有一个类似的问题,刚刚找到了一个在我的情况下似乎有效的解决方案:

router.get('/users', function(req, res, next) {
  models.User.findAll({
      include: [ {model: models.House, as: 'houses'} ],
      raw: false // returns result-set as sequelize object...
  })
  .then(function(users) {
      users = users.get(); //turns sequelize object into json
      d('num users found: ' + users.length);
      res.json(users);
  })
  .catch(function(err){
      d('DB ERROR: '+err.message);
      next(err);
  });

});
将raw设置为false(或默认设置为false),然后,无论何时需要在res.json之前获取原始json,都可以使用
users.get()
(“users”现在是sequelize实例),然后可以获取sequelize对象的json,该对象现在是一个具有关联数组的对象

 models.User.findAll({
      include: [ models.House ],
      nest: true
  })

将嵌套属性添加到查询中
删除原始数据true

有关问题的更多信息


你能发布你的模型文件吗?谢谢@AlessandRoloziobizio!!我刚刚添加了模型,请告诉我是否可以提供任何其他内容。再次感谢@Alessandro Loziobiz Bisi不幸的是,在添加了,{as:'houses}之后,正如您在用户模型和api查询中建议的那样,我收到了以下错误消息-错误:House与用户不关联!这很奇怪,因为它是关联的:(有什么想法吗?这很奇怪!你确定你使用了相同的值吗?因为这是当你在模型中指定一个别名时抛出的错误,你在查询中省略或更改了它…真的很奇怪…我一次又一次地检查它,有一件事我遗漏了,但我仍然得到了—“House(House)”请注意,我还在房屋模型上定义了一个关联-House.belongsTo(models.User)我不知道它是否与此有关…我是否也应该以某种方式修改它?更新-现在它似乎可以正常工作,没有错误…奇怪的是…模型仍然以相同的方式连接,api查询是相同的…可能是某种内部缓存…?在任何情况下-最终的行为并不能解决原始问题-相反返回House.id、House.description等…它返回别名-House.id、House.description等…users.get()显示typeerror。它不是一个函数:(将raw:false改为raw:true似乎可以解决问题,但我没有料到raw选项会出现这种行为。据我所知,该选项应该只从数据库返回纯响应,而不是将对象与所有元数据信息一起续集。)。