title: Node.js TypeError: Wit is not a constructor
body: <p>How to solve "Wit is not a constructor" error coming from Node.js while executing code given by <a href="https://github.com/wit-ai/node-wit/blob/master/examples/messenger.js" rel="nofollow">node-wit</a> and <a href="https://wit.ai/docs/quickstart" rel="nofollow">wit.ai</a> documentation.<br/></p>
  
  <pre><code>// Setting up our bot
  const wit = new Wit(WIT_TOKEN, actions);
  </code></pre>
  
  <p>I tried all the ways by upgrading and downgrading npm/node versions, but no luck.</p>
  
  <p><strong>Update:</strong> Please find the index.js source I used,<br/>
  Do I need to change anything in this?</p>
  
  <pre><code>module.exports = {
    Logger: require('./lib/logger.js').Logger,
    logLevels: require('./lib/logger.js').logLevels,
    Wit: require('./lib/wit.js').Wit,
  }
  
  'use strict';
  
  var express = require('express');
  var bodyParser = require('body-parser');
  var request = require('request');
  const Logger = require('node-wit').Logger;
  const levels = require('node-wit').logLevels;
  var app = express();
  
  app.use(bodyParser.urlencoded({extended: false}));
  app.use(bodyParser.json());
  app.listen((process.env.PORT || 3000));
  
  //const Wit = require('node-wit').Wit;
  const WIT_TOKEN = process.env.WIT_TOKEN;
  const FB_PAGE_TOKEN = process.env.FB_PAGE_TOKEN;
  const Wit = require('node-wit').Wit;
  
  // Server frontpage
  app.get('/', function (req, res) {
      debugger;
      res.send('This is TestBot Server');
  });
  
  
  // Messenger API specific code
  
  // See the Send API reference
  // https://developers.facebook.com/docs/messenger-platform/send-api-reference
  const fbReq = request.defaults({
    uri: 'https://graph.facebook.com/me/messages',
    method: 'POST',
    json: true,
    qs: { access_token: FB_PAGE_TOKEN },
    headers: {'Content-Type': 'application/json'},
  });
  
  const fbMessage = (recipientId, msg, cb) =&gt; {
    const opts = {
      form: {
        recipient: {
          id: recipientId,
        },
        message: {
          text: msg,
        },
      },
    };
    fbReq(opts, (err, resp, data) =&gt; {
      if (cb) {
        cb(err || data.error &amp;&amp; data.error.message, data);
      }
    });
  };
  
  // See the Webhook reference
  // https://developers.facebook.com/docs/messenger-platform/webhook-reference
  const getFirstMessagingEntry = (body) =&gt; {
    const val = body.object == 'page' &amp;&amp;
      body.entry &amp;&amp;
      Array.isArray(body.entry) &amp;&amp;
      body.entry.length &gt; 0 &amp;&amp;
      body.entry[0] &amp;&amp;
      body.entry[0].id === FB_PAGE_ID &amp;&amp;
      body.entry[0].messaging &amp;&amp;
      Array.isArray(body.entry[0].messaging) &amp;&amp;
      body.entry[0].messaging.length &gt; 0 &amp;&amp;
      body.entry[0].messaging[0]
    ;
    return val || null;
  };
  
  // Wit.ai bot specific code
  
  // This will contain all user sessions.
  // Each session has an entry:
  // sessionId -&gt; {fbid: facebookUserId, context: sessionState}
  const sessions = {};
  
  const findOrCreateSession = (fbid) =&gt; {
    var sessionId;
    // Let's see if we already have a session for the user fbid
    Object.keys(sessions).forEach(k =&gt; {
      if (sessions[k].fbid === fbid) {
        // Yep, got it!
        sessionId = k;
      }
    });
    if (!sessionId) {
      // No session found for user fbid, let's create a new one
      sessionId = new Date().toISOString();
      sessions[sessionId] = {fbid: fbid, context: {}};
    }
    return sessionId;
  };
  
  // Our bot actions
  const actions = {
    say(sessionId, context, message, cb) {
      // Our bot has something to say!
      // Let's retrieve the Facebook user whose session belongs to
      const recipientId = sessions[sessionId].fbid;
      if (recipientId) {
        // Yay, we found our recipient!
        // Let's forward our bot response to her.
        fbMessage(recipientId, message, (err, data) =&gt; {
          if (err) {
            console.log(
              'Oops! An error occurred while forwarding the response to',
              recipientId,
              ':',
              err
            );
          }
  
          // Let's give the wheel back to our bot
          cb();
        });
      } else {
        console.log('Oops! Couldn\'t find user for session:', sessionId);
        // Giving the wheel back to our bot
        cb();
      }
    },
    merge(sessionId, context, entities, message, cb) {
      cb(context);
    },
    error(sessionId, context, error) {
      console.log(error.message);
    },
    // You should implement your custom actions here
    // See https://wit.ai/docs/quickstart
  };
  
  const wit = new Wit(WIT_TOKEN, actions);
  
  // Message handler
  app.post('/webhook', (req, res) =&gt; {
    // Parsing the Messenger API response
    // Setting up our bot
  //const wit = new Wit(WIT_TOKEN, actions);
    const messaging = getFirstMessagingEntry(req.body);
    if (messaging &amp;&amp; messaging.message &amp;&amp; messaging.message.text) {
      // Yay! We got a new message!
  
      // We retrieve the Facebook user ID of the sender
      const sender = messaging.sender.id;
  
      // We retrieve the user's current session, or create one if it doesn't exist
      // This is needed for our bot to figure out the conversation history
      const sessionId = findOrCreateSession(sender);
  
      // We retrieve the message content
      const msg = messaging.message.text;
      const atts = messaging.message.attachments;
  
      if (atts) {
        // We received an attachment
  
        // Let's reply with an automatic message
        fbMessage(
          sender,
          'Sorry I can only process text messages for now.'
        );
      } else if (msg) {
        // We received a text message
  
        // Let's forward the message to the Wit.ai Bot Engine
        // This will run all actions until our bot has nothing left to do
        wit.runActions(
          sessionId, // the user's current session
          msg, // the user's message 
          sessions[sessionId].context, // the user's current session state
          (error, context) =&gt; {
            if (error) {
              console.log('Oops! Got an error from Wit:', error);
            } else {
              // Our bot did everything it has to do.
              // Now it's waiting for further messages to proceed.
              console.log('Waiting for futher messages.');
  
              // Based on the session state, you might want to reset the session.
              // This depends heavily on the business logic of your bot.
              // Example:
              // if (context['done']) {
              //   delete sessions[sessionId];
              // }
  
              // Updating the user's current session state
              sessions[sessionId].context = context;
            }
          }
        );
      }
    }
    res.sendStatus(200);
  });
  </code></pre>