knex.js - 读取然后更新会引发错误
knex.js - reading then updating throws an Error
我正在尝试链接读取和更新操作。首先,我根据 id 从数据库中读取(获取)数据,然后我更改它并想更新数据库中的数据,但我得到一个 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(仅相关函数)
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 是异步的,所以该行在 read()
指令 之后执行(由于快速执行)但是 before 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();
我正在尝试链接读取和更新操作。首先,我根据 id 从数据库中读取(获取)数据,然后我更改它并想更新数据库中的数据,但我得到一个 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(仅相关函数)
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 是异步的,所以该行在 read()
指令 之后执行(由于快速执行)但是 before 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();