Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
Angularjs Sequelize将数据保存在BelongToMany创建的表中并从中读取(最后的解决方案)_Angularjs_Sql Server_Node.js_Express_Sequelize.js - Fatal编程技术网

Angularjs Sequelize将数据保存在BelongToMany创建的表中并从中读取(最后的解决方案)

Angularjs Sequelize将数据保存在BelongToMany创建的表中并从中读取(最后的解决方案),angularjs,sql-server,node.js,express,sequelize.js,Angularjs,Sql Server,Node.js,Express,Sequelize.js,我正在使用Backend Node.js、Express.js和Sequelize连接数据库。 我在任务和键之间有一个n:m关系。 任务和密钥由我和TaskKey通过Sequelize with创建: 后端 // Tasks n:m Keys db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'}); db.Task.belongsToMany(db.DictKey,

我正在使用Backend Node.js、Express.js和Sequelize连接数据库。 我在任务和键之间有一个n:m关系。

任务和密钥由我和TaskKey通过Sequelize with创建:

后端

    // Tasks n:m Keys
    db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
    db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});
$scope.create = () => {
    this.$http.post('/api/tasks', {
        user_id: $scope.selectUser,
        lang_id: $scope.selectLang,
        name: $scope.newTask
    });
}
现在,如果我在

前端

    // Tasks n:m Keys
    db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
    db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});
$scope.create = () => {
    this.$http.post('/api/tasks', {
        user_id: $scope.selectUser,
        lang_id: $scope.selectLang,
        name: $scope.newTask
    });
}
我想随该请求一起发送用户选择的所有密钥的数组

在后端,它应该为每个发送的DictKey为新任务添加一个条目到
TaskKeys
。 比如说

表任务:

ID | some values
1  | some values | this is the new task created
在数组[2,5,6]中发送密钥

TaskKey/同时在此表中创建从属密钥

TaskID | KeyID
1      | 2
1      | 5
1      | 6
我怎样才能做到这一点

之后,我想展示一个任务。 以前面的例子为例。 获取id=1的任务 ng由于TaskKey表,重复所有数据并获得所有键

我找不到一个例子来解释这一点,目前我唯一的解决方案是在前端使用
$http.post(taskkey)
为表中的每个键使用
foreach
。但是稍后在实时系统中会有1000多个密钥,所以这不是一个可接受的解决方案。 对于后端,有没有一个好的解决方案

Edit1:

...    working fine
$scope.create = () => {
            this.$http.post('/api/tasks', {
              task:{
              user_id: $scope.selectUser,
              lang_id: $scope.selectLang,
              name: $scope.newTask
            },
            keys:[1,2,3,4,5]
          });
    ...
 ... 
// Creates a new Task in the DB
export function create(req, res) {
  return Task.create(req.body.task)
  .then(function(task){
    return task.addTaskKeys(req.body.keys);//throws 500error
    //console.log(req.body.keys);//working fine getting the Keys
  })
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
}
...
阅读文档没有多大帮助,因为没有示例或详细说明。 我试过以下几种方法:

  • addTask/addTasks/addTaskKeys/addKey如文档中为添加关联而解释的
  • createTask/createKey/createTaskKeys用于创建关联
在我的后端,我没有任何任务键功能,只有任务和键。但据我所知,我不需要任何任务键,因为

 // Tasks n:m Keys
    db.DictKey.belongsToMany(db.Task, { through: 'TaskKeys' , foreignKey:'key_id'});
    db.Task.belongsToMany(db.DictKey, { through: 'TaskKeys' , foreignKey: 'task_id'});  
创建中间表任务和键之间存在关联。因此,通常情况下,添加/创建应该可以正常工作,并且应该在TaskKey中添加实例

 export function create(req, res) {
      return Task.create(req.body.task)
      .then(function(task){
        return task.addTaskKeys(req.body.keys);//throws 500error
使用task.addTaskKeys添加与刚创建的task=>task\u id的关联

req.body.keys给他钥匙=>key\u id
如果我以Doc change到minde DB为例:

... example
    Project.create({ id: 11 }).then(function (project) {
      user.addProjects([project, 12]);
    });
... mine
return Task.create(req.body.task)
  .then(function(task){
    return DictKey.addTasks([task,{key_id : 1}]);//still error
  })//DictKey.addTask(task,1); still error
阅读以下内容并引用:

user.addProject(项目,{status:'started'}) 默认情况下,代码将向UserProjects表添加projectId和userId

正在尝试创建关联:

// Creates a new Task in the DB
export function create(req, res) {
  Task.create({
  name: req.body.task.name,
  user_id: req.body.task.user_id,
  lang_id: req.body.task.lang_id
}).then(function(task) {
    return DictKey.create({ name:req.body.task.name,notice:req.body.task.name, user_id:req.body.task.user_id })
    .then(function(key) {
      return task.hasDictKey(key).then(function(result) {
        // result would be false
        return task.addDictKey(key).then(function() {
          return task.hasDictKey(key).then(function(result) {
            // result would be true
          })
        })
      })
    })
  })
抱歉,不允许发布更多的as 1链接

无错误,但仅创建任务而非任务键。。。。 那么我一直在做错什么呢

Edit2: 为了进行测试,我在MsSql中自己在TaskKeys表中插入了数据。 TaskKey/使用SqlQuery自行创建的数据

TaskID | KeyID
1      | 1
1      | 2
1      | 3
2      | 4
2      | 5
从我的前端获取它

this.$http.get('/api/tasks/' +2 )
            .then(response => {
              this.Tasks = response.data;
              console.log(this.Tasks);
            });
// Gets a single Task from the DB
export function show(req, res) {
  return Task.findAll({
    where: {
      _id: req.params.id
    },
    include: [{
      model: DictKey
    }]
  })
    .then(handleEntityNotFound(res))
    .then(respondWithResult(res))
    .catch(handleError(res));
}
后端

this.$http.get('/api/tasks/' +2 )
            .then(response => {
              this.Tasks = response.data;
              console.log(this.Tasks);
            });
// Gets a single Task from the DB
export function show(req, res) {
  return Task.findAll({
    where: {
      _id: req.params.id
    },
    include: [{
      model: DictKey
    }]
  })
    .then(handleEntityNotFound(res))
    .then(respondWithResult(res))
    .catch(handleError(res));
}
控制台输出:

[Object]
Object
_id:2 // the searched TaskId= 2 => right
dict_Keys:Array[2] // the Dependant 2 KeyIds => right
因此,创建的表工作正常。 现在的问题是,为什么通过后端添加addKey不起作用,方法与示例中相同。 尝试使用该示例检查关联:

// Creates a new Task in the DB
export function create(req, res) {
  Task.create({
  name: req.body.task.name,
  user_id: req.body.task.user_id,
  lang_id: req.body.task.lang_id
}).then(function(task) {
    return DictKey.create({ name:req.body.task.name,notice:req.body.task.name, user_id:req.body.task.user_id })
    .then(function(key) {
      return task.hasDictKey(key).then(function(result) {
        // result would be false
        return task.addDictKey(key).then(function() {
          return task.hasDictKey(key).then(function(result) {
            // result would be true
          })
        })
      })
    })
  })
抛出task.hasDictKey不是函数

db.Task.create({
  name: 'test',
  user_id: 266,
  lang_id: 9,
  key_id:[1,2]
},{
  include: [db.DictKey]
})
抛出的dict_键与任务不关联 这意味着它们没有联系在一起?但是在数据库中读取数据和插入数据是否有效

现在刚刚添加Sequelize的示例:

var Usert = db.sequelize.define('usert', {})
var Project = db.sequelize.define('project', {})
var UserProjects = db.sequelize.define('userProjects', {
    status: Sequelize.STRING
})

Usert.belongsToMany(Project, { through: UserProjects })
Project.belongsToMany(Usert, { through: UserProjects })
Usert.addProject(Project, { status: 'started' })//addProject is not a Function // for real ? now not even their own is not working? :/
回答
通过阅读我和你一起思考的文件

// Tasks n:m Keys
db.DictKey.belongsToMany(db.Task, { through: TaskKeys , foreignKey:'key_id',otherKey:'task_id'});
db.Task.belongsToMany(db.DictKey, { through: TaskKeys , foreignKey: 'task_id',otherKey: 'key_id'});
它将自动为DictKey生成add/set/get/create任务,并为Task生成add/set/get/create DictKey

但是

命名策略

默认情况下,sequelize将使用模型名称(传递给 sequelize.define)来计算模型在中使用时的名称 协会

这意味着它会根据您要定义的表模型的名称添加函数('dict_Keys')… 所以将/set/get/Dict_键添加到任务中。 这就是问题所在,因为我使用的是addDictkey而不是addDict_Key。
我希望它能帮助将来的其他人

前端:要从前端获取数据,只需将数组作为您发布的
数据的属性。您可能还希望将特定于任务的属性包装到他们自己的对象中:

this.$http.post('/api/tasks', {
    task: {
        user_id: $scope.selectUser,
        lang_id: $scope.selectLang,
        name: $scope.newTask
    },
    keys: [ 2, 5, 6 ]
});
后端:Sequelize和其他ORM试图为您提供使用您定义的关系的工具。使用它们。您已经在使用,因此您只需执行下一步,即使用您创建的
任务
对象在
任务键
中创建
m:n
条目:

...
return Task.create(req.body.task)
    .then(function(task) {
        return task.addProjects(req.body.keys);
    })
    .then(respondWithResult(res, 201))
    .catch(handleError(res));
...
对于使用键获取任务,只需使用
include
选项:

...
return Task.findById(req.params.id, {
    include: [ { model: db.DictKey } ]
})
...

foreignKey
在关系的两侧应该是相同的,若要设置另一个键,请使用
otherKey
选项。

谢谢帮助。前端正在工作,但后端仍然存在问题。如果您可以检查Edit1,当您收到
return task.addTaskKeys(req.body.keys)的500错误时,控制台在服务器上会显示什么;
?Console.log:…先创建任务。创建然后执行任务添加
POST/api/tasks 500 57.938 ms-2
BrwoserConsole日志:
POSThttp://localhost:9000/api/tasks 500(内部服务器错误)
我尝试使用像addTask(1)这样的硬代码值;//1确保键表中100%存在相同的错误您可以在启动服务器之前将
DEBUG
环境变量设置为
*
,然后重试吗?这应该会提供更多信息…例如
DEBUG=*node server.js
执行
DEBUG=express:*node index.js
,在调试时从express文档开始。输出没有太大变化t、 但是注释
Task.create
out并仅执行
return Task.addKeys(1)
给出错误,无法读取未定义的addTask的属性?在
//Tasks n:m Keys db.DictKey.belongtomany(db.Task,{through:'TaskKeys',foreignKey:'key\u id',otherKey:'Task\u id'});db.Task.belongtomany(db.DictKey,{through:'TaskKeys',foreignKey:'task_id',otherKey:'key_id'});
未解决此问题。它与b