Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.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
使用Sequelize、NodeJS和AngularJS创建具有n:m关系的记录_Angularjs_Node.js_Sequelize.js - Fatal编程技术网

使用Sequelize、NodeJS和AngularJS创建具有n:m关系的记录

使用Sequelize、NodeJS和AngularJS创建具有n:m关系的记录,angularjs,node.js,sequelize.js,Angularjs,Node.js,Sequelize.js,更新:我得到了一个公平的一点进一步。请看下面的帖子 我正在从事一个基于sqlfullstackyeoman生成器的项目,并一直使用附带的示例代码作为指导。大部分情况下,事情进展顺利,但我现在的情况是,我有两个具有双向n:m关系的表/模型: 工作组: module.exports = function(sequelize, DataTypes) { var TaskGroup = sequelize.define("TaskGroup", { taskGroupID: {

更新:我得到了一个公平的一点进一步。请看下面的帖子

我正在从事一个基于
sqlfullstack
yeoman生成器的项目,并一直使用附带的示例代码作为指导。大部分情况下,事情进展顺利,但我现在的情况是,我有两个具有双向n:m关系的表/模型:

工作组:

module.exports = function(sequelize, DataTypes) {
  var TaskGroup = sequelize.define("TaskGroup", {
    taskGroupID: {
      field: "TaskGroupID",
      type: DataTypes.INTEGER,
      allowNull: false,
      unique: true,
      autoIncrement: true,
      primaryKey: true
    },
    name: {
      field: "Name",
      type: DataTypes.STRING,
      allowNull: false
    },
    description: {
      field: "Description",
      type: DataTypes.STRING
    },
    modifiedBy: {
      field: "ModifiedBy",
      type: DataTypes.STRING
    }
  });
和任务:

module.exports = function(sequelize, DataTypes) {
  var Task = sequelize.define("Task", {
    taskID: {
      field: "TaskID",
      type: DataTypes.INTEGER,
      allowNull: false,
      unique: true,
      autoIncrement: true,
      primaryKey: true
    },
    name: {
      field: "Name",
      type: DataTypes.STRING,
      allowNull: false
    },
    description: {
      field: "Description",
      type: DataTypes.STRING
    },
    isOnRunsheet: {
      field: "IsOnRunsheet",
      type: DataTypes.BOOLEAN
    },
    modifiedBy: {
      field: "ModifiedBy",
      type: DataTypes.STRING
    }
  });
关系:

  // Tasks can belong to more than one group, and groups can belong to more than one task
  db['TaskGroup'].belongsToMany(db['Task'], {as: 'Tasks', through: 'TaskGrouping'});
  db['Task'].belongsToMany(db['TaskGroup'], {as: 'TaskGroups', through: 'TaskGrouping'});
在客户端,用户可以创建新任务,并通过多选列表指定关联的任务组。保存任务时,我有任务字段和关联任务组的数组。使用包含此信息的请求正文进行
post
,以便服务器可以创建任务记录

不幸的是,我似乎无法创建记录。我已经经历了多次迭代,现在我得到了一个合理的例外——我只是被“合理”的事情是什么所困扰

例外情况:

Unhandled rejection SequelizeDatabaseError: Cannot insert the value NULL into column 'TaskTaskID', table 'HelpCard
.dbo.TaskGrouping'; column does not allow nulls. INSERT fails.
    at Query.formatError (C:\Projects\helpcard2\node_modules\sequelize\lib\dialects\mssql\query.js:215:10)
    at Request.userCallback (C:\Projects\helpcard2\node_modules\sequelize\lib\dialects\mssql\query.js:66:25)
    at Request.callback (C:\Projects\node_modules\tedious\lib\request.js:33:27)
    at Connection.message (C:\Projects\node_modules\tedious\lib\connection.js:1179:27)
    at Connection.dispatchEvent (C:\Projects\node_modules\tedious\lib\connection.js:519:45)
    at MessageIO.<anonymous> (C:\Projects\node_modules\tedious\lib\connection.js:439:23)
    at emitNone (events.js:67:13)
    at MessageIO.emit (events.js:166:7)
    at ReadablePacketStream.<anonymous> (C:\Projects\node_modules\tedious\lib\message-io.js:92:15)
    at emitOne (events.js:77:13)
...
…在服务器端:

exports.create = function(req, res) {
  var task = Task(req).build(req.body.task);
  task.setTaskGroups(req.body.taskGroups);
  task
    .save()
    .then(function() {
      return res.status(201).json(task);
    })
    .catch(function (err){
      if(err) { return handleError(res, err); }
    });
};
我确信我遗漏了一些明显的东西,但我发现的文档对于这样的场景非常清晰。我希望得到任何指导;我刚刚进入sequelize,我觉得有些时候我可能吃得太多了

更新:在仔细查看SQL之后,我发现在尝试插入联接表(TaskGroupings)时引发了异常。它试图为任务的主ID插入NULL,这通常不是一件好事。看着代码,我意识到我在保存记录之前试图添加关联,没有PK。在
save()
之后移动
task.addTaskGroups()
解决了该问题

但是,我也意识到我正在将TaskGroup对象数组传递给'addTaskGroup()`调用,而不是实际的ID。因此,我对客户端控制器进行了如下修改:

$scope.createTask = function() {
  if($scope.newTask === '') {
    return;
  }
  $scope.groupKeys = [];
  angular.forEach($scope.selectedGroups, function(taskGroup) {
    $scope.groupKeys.push(taskGroup.taskGroupID);
  });
  $scope.newTask.modifiedBy = 'tkturney';
  var taskBundle = {
      task: $scope.newTask,
      taskGroups: $scope.groupKeys
  };
  $http.post('/api/tasks', taskBundle);
  ...
当我查看调试器时,我可以看到
任务组
对象中的所有内容,但是
任务组.taskGroupID
返回为
未定义
,因此我仍然得到一个异常,因为我没有将PKs传递给关联的另一方


这个代码片段有什么问题吗?

好的,从下面更改服务器端控制器:

exports.create = function(req, res) {
  var task = Task(req).build(req.body.task);
  task.setTaskGroups(req.body.taskGroups);
  task
    .save()
    .then(function() {
      return res.status(201).json(task);
    })
    .catch(function (err){
      if(err) { return handleError(res, err); }
    });
};
为此:

exports.create = function(req, res) {
  var task = Task(req).build(req.body.task);
  task
    .save()
    .then(function() {
      task.setTaskGroups(req.body.taskGroups);
      return res.status(201).json(task);
    })
    .catch(function (err){
      if(err) { return handleError(res, err); }
    });
};
那个特殊的例外消失了。我遗漏了一件事(尽管它一直盯着我看),那就是有两个独立的插入正在发生——一个用于任务,一个用于关联。我想在保存任务之前需要设置关联,但没有意识到设置该关联会导致另一次插入

我仍然需要弄清楚为什么关联另一方的PK没有被填充,但这超出了原始问题的范围

exports.create = function(req, res) {
  var task = Task(req).build(req.body.task);
  task
    .save()
    .then(function() {
      task.setTaskGroups(req.body.taskGroups);
      return res.status(201).json(task);
    })
    .catch(function (err){
      if(err) { return handleError(res, err); }
    });
};