Charge71 / botpress-webhook

Botpress module to create and manage webhooks to your bot
GNU General Public License v3.0
4 stars 6 forks source link

Knex db error when posting to webhook #3

Closed akapei closed 6 years ago

akapei commented 6 years ago

I'm making a /post to a webhook platform I created.

However, I'm getting this error from in Botpress:

Unhandled Rejection in Promise: Promise { _bitField: 18087936, _fulfillmentHandler0: Error: Undefined binding(s) detected when compiling SELECT query: select * from "hitl_sessions" where "platform" = ? and "userId" = ? limit ? at QueryCompiler_SQLite3.toSQL (/home/ubuntu/bot/node_modules/knex/lib/query/compiler.js:131:13) at Builder.toSQL (/home/ubuntu/bot/node_modules/knex/lib/query/builder.js:115:44) at /home/ubuntu/bot/node_modules/knex/lib/runner.js:56:32 at tryCatcher (/home/ubuntu/bot/node_modules/bluebird/js/release/util.js:16:23) at /home/ubuntu/bot/node_modules/bluebird/js/release/using.js:185:26 at tryCatcher (/home/ubuntu/bot/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:512:31) at Promise._settlePromise (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:569:18) at Promise._settlePromise0 (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:693:18) at Promise._fulfill (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:638:18) at PromiseArray._resolve (/home/ubuntu/bot/node_modules/bluebird/js/release/promise_array.js:126:19) at PromiseArray._promiseFulfilled (/home/ubuntu/bot/node_modules/bluebird/js/release/promise_array.js:144:14) at Promise._settlePromise (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:574:26) at Promise._settlePromise0 (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:693:18), _rejectionHandler0: undefined, _promise0: undefined, _receiver0: undefined } Reason: Error: Undefined binding(s) detected when compiling SELECT query: select * from "hitl_sessions" where "platform" = ? and "userId" = ? limit ? at QueryCompiler_SQLite3.toSQL (/home/ubuntu/bot/node_modules/knex/lib/query/compiler.js:131:13) at Builder.toSQL (/home/ubuntu/bot/node_modules/knex/lib/query/builder.js:115:44) at /home/ubuntu/bot/node_modules/knex/lib/runner.js:56:32 at tryCatcher (/home/ubuntu/bot/node_modules/bluebird/js/release/util.js:16:23) at /home/ubuntu/bot/node_modules/bluebird/js/release/using.js:185:26 at tryCatcher (/home/ubuntu/bot/node_modules/bluebird/js/release/util.js:16:23) at Promise._settlePromiseFromHandler (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:512:31) at Promise._settlePromise (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:569:18) at Promise._settlePromise0 (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:693:18) at Promise._fulfill (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:638:18) at PromiseArray._resolve (/home/ubuntu/bot/node_modules/bluebird/js/release/promise_array.js:126:19) at PromiseArray._promiseFulfilled (/home/ubuntu/bot/node_modules/bluebird/js/release/promise_array.js:144:14) at Promise._settlePromise (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:574:26) at Promise._settlePromise0 (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:614:10) at Promise._settlePromises (/home/ubuntu/bot/node_modules/bluebird/js/release/promise.js:693:18)

akapei commented 6 years ago

Discovered the error was a conflict with HITL module.

Whenever an there's an incoming message HITL tries to create new session in the db. It looks for an existing session in the db:

function getUserSession(event) {
      var userId = event.user && event.user.id || event.raw.to;
      return knex('hitl_sessions').where({ platform: event.platform, userId: userId }).select('*').limit(1).then(function (users) {
        if (!users || users.length === 0) {
          return createUserSession(event);
        } else {
          return users[0];
        }
      });
    }

Unless you pass in property to as well as a user object in the params to be parsed it throws an error as you can't have an undefined value in .where. Even if you pass in an arbitrary value in the body of the request in the form of event.raw.to, HITL will try to create a new session:

function createUserSession(event) {
      var profileUrl = null;
      var full_name = '#' + Math.random().toString().substr(2);

      if (event.user && event.user.first_name && event.user.last_name) {
        profileUrl = event.user.profile_pic || event.user.picture_url;
        full_name = event.user.first_name + ' ' + event.user.last_name;
      }

      var session = {
        platform: event.platform,
        userId: event.user.id,
        user_image_url: profileUrl,
        last_event_on: (0, _botpress.DatabaseHelpers)(knex).date.now(),
        last_heard_on: (0, _botpress.DatabaseHelpers)(knex).date.now(),
        paused: 0,
        full_name: full_name,
        paused_trigger: null
      };

      return knex('hitl_sessions').insert(session).then(function (results) {
        session.id = results[0];
        session.is_new_session = true;
      }).then(function () {
        return knex('hitl_sessions').where({ id: session.id }).then().get(0);
      }).then(function (db_session) {
        return Object.assign({}, session, db_session);
      });
    }

When using modules like Webhook that does not attach a user object to the event object causes an error in incomingMiddlewares because HITL tries to create new session but throws an error as user.id is undefined in knex db create.

Created a pull request on HITL module. Might consider modifying this module to account for a user to be passed in so Webhooks can work with HITL module and Webhook conversations are tracked.