title: Building a slack bot in node.js, throwing an error I can't make sense of. Has anyone seen this before?
body: <p>I am trying to build a slack bot, and I have come across an error I can't make sense of. </p>
  
  <p>This is the error: </p>
  
  <pre><code>/Users/maecapozzi/Desktop/maebot/node_modules/vow/lib/vow.js:104
          throw e;
          ^
  
  Error: [Slack Bot Error] undefined
      at assert (/Users/maecapozzi/Desktop/maebot/node_modules/slackbots/libs/utils.js:15:15)
      at /Users/maecapozzi/Desktop/maebot/node_modules/slackbots/index.js:42:9
      at Array.&lt;anonymous&gt; (/Users/maecapozzi/Desktop/maebot/node_modules/vow/lib/vow.js:712:56)
      at Immediate.callFns [as _onImmediate] (/Users/maecapozzi/Desktop/maebot/node_modules/vow/lib/vow.js:23:35)
      at tryOnImmediate (timers.js:534:15)
      at processImmediate [as _immediateCallback] (timers.js:514:5)
  </code></pre>
  
  <p>I'll share my code with you as well, since that should help to make more sense of what has happened. </p>
  
  <p>bot.js : </p>
  
  <pre><code>'use strict';
  
  var MaeBot = require('../lib/maebot');
  
  var token = process.env.BOT_API_KEY;
  var dbPath = process.env.BOT_DB_PATH;
  var name = process.env.BOT_NAME;
  
  var maebot = new MaeBot({
      token: token,
      dbPath: dbPath,
      name: name
  });
  
  maebot.run(); 
  </code></pre>
  
  <p>database.js: </p>
  
  <pre><code>var pg = require('pg');
  var connectionString = process.env.DATABASE_URL || 'postgres://localhost:5432/maebot';
  
  var client = new pg.Client(connectionString);
  client.connect();
  var query = client.query('CREATE TABLE dacts(id SERIAL PRIMARY KEY, text VARCHAR(40) not null)');
  query.on('end', function() { client.end(); });
  </code></pre>
  
  <p>maebot.js: </p>
  
  <pre><code>'use strict';
  
  var util = require('util'); 
  var path = require('path');
  var fs = require('fs');
  var PostGres = require('postgresql'); 
  var Bot = require('slackbots');
  
  var MaeBot = function Constructor(settings) { 
    this.settings = settings;
    this.settings.name = this.settings.name || 'maebot'; 
    this.dbPath = settings.dbPath || path.resolve(process.cwd(), 'data', 'database.js');
    this.user = null;
    this.db = null;
  };
  
  
  MaeBot.prototype.run = function () { 
    MaeBot.super_.call(this, this.settings);
  
    this.on('start', this._onStart); 
    this.on('message', this._onMessage);
  };
  
  MaeBot.prototype._onStart = function () { 
    this._loadBotUser(); 
    this._connectDB(); 
  }; 
  
  MaeBot.prototype._loadBotUser = function () { 
    var self = this; 
    this.user = this.users.filter (function (user) { 
      return user.name === self.name; 
    })[0];
  }; 
  
  MaeBot.prototype._connectDB = function () { 
    if (!fs.existsSync(this.dbPath)) { 
      console.error('Database path ' + '"' + this.dbPath + '" does not exists or it\'s not readable."')
      process.exit(1); 
    }
  
    this.db = new PostGres.Database(this.dbPath);
  }; 
  
  MaeBot.prototype._welcomeMessage = function () {
    this.postMessageToChannel(this.channels[0].name, 'Hi! Maebot here.' +
      '\n I can tell you about my creator, Mae. Just say `Hi, maebot` or `' + this.name + '` to invoke me!',
      {as_user: true});
  };
  
  MaeBot.prototype._onMessage = function (message) {
    if (this._isChatMessage(message) &amp;&amp;
      this._isChannelConversation(message) &amp;&amp;
      !this._isFromMaeBot(message) &amp;&amp;
      this._isMentioningMaeBot(message)
      ) {
      this._replyWithRandomFact(message);
  }
  };
  
  MaeBot.prototype._isChatMessage = function (message) {
    return message.type === 'message' &amp;&amp; Boolean(message.text);
  };
  
  
  MaeBot.prototype._isChannelConversation = function (message) {
    return typeof message.channel === 'string' &amp;&amp;
    message.channel[0] === 'C';
  };
  
  MaeBot.prototype._isFromMaeBot = function (message) {
    return message.user === this.user.id;
  };
  
  MaeBot.prototype._isMentioningMaeBot = function (message) {
    return message.text.toLowerCase().indexOf('maebot') &gt; -1 ||
    message.text.toLowerCase().indexOf(this.name) &gt; -1;
  };
  
  MaeBot.prototype._replyWithRandomFact = function (originalMessage) {
    var self = this;
    self.db.get('SELECT id, fact FROM facts ORDER BY used ASC, RANDOM() LIMIT 1', function (err, record) {
      if (err) {
        return console.error('DATABASE ERROR:', err);
      }
  
      var channel = self._getChannelById(originalMessage.channel);
      self.postMessageToChannel(channel.name, record.fact, {as_user: true});
      self.db.run('UPDATE facts SET used = used + 1 WHERE id = ?', record.id);
    });
  };
  
  MaeBot.prototype._getChannelById = function (channelId) {
    return this.channels.filter(function (item) {
      return item.id === channelId;
    })[0];
  };
  
  util.inherits(MaeBot, Bot); 
  
  module.exports = MaeBot;
  </code></pre>