knex.js – 阅读然后更新抛出一个错误

我试图链阅读和更新操作。 首先,我从数据库中读取(获取)基于id的数据 ,然后更改它并希望更新数据库中的数据,但是我得到了Unhandled rejection Error: There is no pool defined on the current client错误Unhandled rejection Error: There is no pool defined on the current client

index.js

 var id = args.id; var proj = new Project(id); proj.read(knex).then(function(rows) { proj.set(args); proj.update(knex).then(console.log); // <== ERROR THROWN HERE }); 

Project.js (只有相关的function)

 read(knex) { var self = this; return knex('projects').where('id', this.id).then(function(rows) { if (rows.length == 0) throw '[panda] Read project: no project with id = ' + self.id; self.set(rows[0]); return self; }); } update(knex) { console.log(knex('projects').where('id', this.id).update(this).toString()); return knex('projects').where('id', this.id).update(this); } 

命令

 $ node index.js projects update --id=5 --name=Test-update update "projects" set "completion" = 0, "currentIteration" = NULL, "id" = 5, "name" = 'Test-update' where "id" = 5 Unhandled rejection Error: There is no pool defined on the current client at /home/flawyte/development/projects/js/panda/node_modules/knex/lib/client.js:202:25 at tryCatcher (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/util.js:26:23) at Promise._resolveFromResolver (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/promise.js:480:31) at new Promise (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/promise.js:70:37) at Client.acquireConnection (/home/flawyte/development/projects/js/panda/node_modules/knex/lib/client.js:200:12) at /home/flawyte/development/projects/js/panda/node_modules/knex/lib/runner.js:136:49 at tryCatcher (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/util.js:26:23) at Function.Promise.attempt.Promise.try (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/method.js:31:24) at Runner.ensureConnection (/home/flawyte/development/projects/js/panda/node_modules/knex/lib/runner.js:135:26) at Runner.run (/home/flawyte/development/projects/js/panda/node_modules/knex/lib/runner.js:30:31) at QueryBuilder.Target.then (/home/flawyte/development/projects/js/panda/node_modules/knex/lib/interface.js:27:43) at /home/flawyte/development/projects/js/panda/index.js:80:31 at tryCatcher (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/util.js:26:23) at Promise._settlePromiseFromHandler (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/promise.js:507:31) at Promise._settlePromiseAt (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/promise.js:581:18) at Promise._settlePromises (/home/flawyte/development/projects/js/panda/node_modules/bluebird/js/main/promise.js:697:14) 

如果我删除index.js中的then(console.log) ,则不会抛出任何错误,但脚本结束后数据库中的数据保持不变。 为什么?

我有一个行knex.destroy(); 在脚本的最后,因为knex是asynchronous的,所以在read()指令(由于快速执行) 之前 ,但是 update() 之前执行该行,导致上面的错误。

Project.js

 var done = false; proj.read(knex).then(function(rows) { proj.set(args); proj.update(knex).then(function(res) { done = true; console.log(res); knex.destroy(); }); }); // ... if (!done) // End database connection here // in case an error prevented it from being destroyed after update // which would in turn prevent the script from ending knex.destroy();