简体   繁体   中英

knex.js - reading then updating throws an Error

I'm trying to chain read and update operations. First I read (fetch) data from the database based on the id , then I change it and want to update the data in the database as well but I get a Unhandled rejection Error: There is no pool defined on the current client error.

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 (only related functions)

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);
}

Command

$ 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)

If I remove the then(console.log) in index.js no error is thrown but data in database remains unchanged after script ending. Why ?

I had a line knex.destroy(); at the very end of my script and as knex is asynchronous, the line was being executed after the read() instruction (due to quick execution) but before update() , causing the error above.

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();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM