在pg-promise中跨多个控制器的多个查询之间共享事务或任务对象

我对node.js,postgresql,Promise和事实上的stackoverflow都比较陌生,所以如果事情听起来有些不协调的话,我会提前道歉的!

我目前正在尝试在各种控制器中分布的链式承诺内运行多个查询。 我想在同一个事务或任务中运行所有的查询,以消除多个连接和断开连接到数据库。

我已经尝试了以下方法,在这里添加一名学生并为该学生分配两名导师。 HTTP请求被路由到学生控制器,该控制器通过学生存储库添加学生。 学生存储库是任务启动的地方,并返回到控制器,该控制器将其转发给导师控制器,并沿着链路进入…

@ HttpPost("/api/students/create") addStudent( @ Req()request) { var studentid; var mentorids= []; //Add the student return this.studentRepository.addStudent(request.body.student) .then(newStudentId => { studentid = newStudentId; //Add the mentors, passing the transaction object received back from studentRepository return this.mentorController.addMentor(request.body.schoolid, request.body.mentors, newStudentId.transaction) .then(result => { var data = []; console.log(result); for (var role in result) { data.push({ mentorid: result[role].roleid, studentid: studentid }); } //Assigns the student to mentors in the link table return this.studentRepository.assignMentor(data) .then(result => { return result; }) }) }); } 

学生存储库

 addStudent(student): any { return this.collection.task(t => { return this.collection.one(this.sql.addStudent, student) .then(studentid => { return { studentid: studentid.studentid, transaction: t } }); }) } 

导师控制器

 addMentor(institutionid: number, mentors, t): any { var promises = []; var mentorIds = []; for (var role in mentors) { promises.push(this.roleController.registerRole(institutionid,mentors[role].role,t)); } return t.batch(promises) .then(result => { return Promise.resolve(result); }) } 

angular色控制器

 @ HttpPost("/api/roles/register") registerRole(institutionid, @ Req()request, t ? ) : any { console.log(request); return this.roleRepository.checkRoleEnrollment(institutionid, request.email, request.roletype, t) .then(result => { return this.roleRepository.addRoleEnrollment(institutionid, request, t) .then(data => { return this.roleRepository.updateRoleEnrollment(data.roleenrollmentid, data.roleid) .then(d => { return data; }) }) }) .catch (error => { return Promise.reject(error); }); } 

我在angular色控制器中调用checkEnrollment时遇到以下错误:

 "name": "Error", "message": "Unexpected call outside of task.", "stack": "Error: Unexpected call outside of task. at Task.query (\api\node_modules\pg-promise\lib\task.js:118:19) at Task.obj.oneOrNone (\api\node_modules\pg-promise\lib\database.js:491:31) at RoleRepository.checkRoleEnrollment.... 

任何帮助将非常感激。 提前感谢你。

根据我之前的评论:

这个错误意味着你试图访问任务分配给任务外的任务的callback函数,即任务的callback已经返回,连接被释放,然后你使用任务分配的连接对象,这当然是无效的。

顺便说一句,我是pg-promise的作者;)

下面是你的代码有效地做的简化forms:

 var cnReference; db.task(t => { cnReference = t; // can only use `t` connection while executing the callback }) .then(data => { // we are now outside of the task; // the task's connection has been closed already, // and we can do nothing with it anymore! return cnReference.query('SELECT...'); }) .catch(error => { // ERROR: Unexpected call outside of task. // We cannot use a task connection object outside of the task's callback! }); 

您需要纠正实施,以确保不会发生。