title: Microsoft Bot Framework - Error reading bot file, but all env variables are correct?
body: <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>// Copyright (c) Microsoft Corporation. All rights reserved.
  // Licensed under the MIT License.
  
  // See https://github.com/microsoft/botbuilder-samples for a more comprehensive list of samples.
  
  // Import required pckages
  const env = require('dotenv').config({path: './.env'});
  
  const path = require('path');
  const restify = require('restify');
  
  // Import required bot services. See https://aka.ms/bot-services to learn more about the different parts of a bot.
  const { BotFrameworkAdapter, MemoryStorage, ConversationState, UserState } = require('botbuilder');
  // Import required bot configuration.
  const { BotConfiguration } = require('botframework-config');
  
  // This bot's main dialog.
  const { BasicBot } = require('./bot');
  
  // Read botFilePath and botFileSecret from .env file
  // Note: Ensure you have a .env file and include botFilePath and botFileSecret.
  const ENV_FILE = path.join(__dirname, '.env');
  
  
  // Get the .bot file path
  // See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.
  const BOT_FILE = path.join(__dirname, (process.env.botFilePath || ''));
  let botConfig;
  try {
      // Read bot configuration from .bot file.
      botConfig = BotConfiguration.loadSync(BOT_FILE, process.env.botFileSecret);
  } catch (err) {
      console.error(typeof(process.env.botFileSecret));
      console.error(`\nError reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.`);
      console.error(`\n - The botFileSecret is available under appsettings for your Azure Bot Service bot.`);
      console.error(`\n - If you are running this bot locally, consider adding a .env file with botFilePath and botFileSecret.`);
      console.error(`\n - See https://aka.ms/about-bot-file to learn more about .bot file its use and bot configuration.\n\n`);
      process.exit();
  }
  
  // For local development configuration as defined in .bot file
  const DEV_ENVIRONMENT = 'development';
  
  // bot name as defined in .bot file or from runtime
  const BOT_CONFIGURATION = (process.env.NODE_ENV || DEV_ENVIRONMENT);
  
  // Get bot endpoint configuration by service name
  const endpointConfig = botConfig.findServiceByNameOrId(BOT_CONFIGURATION);
  
  // Create adapter. 
  // See https://aka.ms/about-bot-adapter to learn more about .bot file its use and bot configuration .
  const adapter = new BotFrameworkAdapter({
      appId: endpointConfig.appId || process.env.microsoftAppID,
      appPassword: endpointConfig.appPassword || process.env.microsoftAppPassword,
      openIdMetadata: process.env.BotOpenIdMetadata
  });
  
  // Catch-all for errors.
  adapter.onTurnError = async (context, error) =&gt; {
      // This check writes out errors to console log
      // NOTE: In production environment, you should consider logging this to Azure
      //       application insights.
      console.error(`\n [onTurnError]: ${ error }`);
      // Send a message to the user
      context.sendActivity(`Oops. Something went wrong!`);
  };
  
  // Define a state store for your bot. See https://aka.ms/about-bot-state to learn more about using MemoryStorage.
  // A bot requires a state store to persist the dialog and user state between messages.
  // let conversationState, userState;
  
  // For local development, in-memory storage is used.
  // CAUTION: The Memory Storage used here is for local bot debugging only. When the bot
  // is restarted, anything stored in memory will be gone.
  // const memoryStorage = new MemoryStorage();
  // conversationState = new ConversationState(memoryStorage);
  // userState = new UserState(memoryStorage);
  
  // CAUTION: You must ensure your product environment has the NODE_ENV set
  //          to use the Azure Blob storage or Azure Cosmos DB providers.
  // const { BlobStorage } = require('botbuilder-azure');
  // Storage configuration name or ID from .bot file
  // const STORAGE_CONFIGURATION_ID = '&lt;STORAGE-NAME-OR-ID-FROM-BOT-FILE&gt;';
  // // Default container name
  // const DEFAULT_BOT_CONTAINER = 'botstate';
  // // Get service configuration
  // const blobStorageConfig = botConfig.findServiceByNameOrId(STORAGE_CONFIGURATION_ID);
  // const blobStorage = new BlobStorage({
  //     containerName: (blobStorageConfig.container || DEFAULT_BOT_CONTAINER),
  //     storageAccountOrConnectionString: blobStorageConfig.connectionString,
  // });
  // conversationState = new ConversationState(blobStorage);
  // userState = new UserState(blobStorage);
  
  // Create the main dialog.
  let bot;
  try {
      bot = new BasicBot(botConfig);
  } catch (err) {
      console.error(`[botInitializationError]: ${ err }`);
      process.exit();
  }
  
  // Create HTTP server
  let server = restify.createServer();
  server.listen(process.env.port || process.env.PORT || 3978, function() {
      console.log(`\n${ server.name } listening to ${ server.url }`);
      console.log(`\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator`);
      console.log(`\nTo talk to your bot, open basic-bot.bot file in the Emulator`);
  });
  
  // Listen for incoming activities and route them to your bot main dialog.
  server.post('/api/messages', (req, res) =&gt; {
      // Route received a request to adapter for processing
      adapter.processActivity(req, res, async (turnContext) =&gt; {
          // route to bot activity handler.
          await bot.onTurn(turnContext);
      });
  });</code></pre>
  </div>
  </div>
  </p>
  
  <p>I'm using this code, which comes straight from the Microsoft Bot Framework tutorial. Every time I run npm start, I'm getting the error in the very first try/catch block ("Error reading bot file. Please ensure you have valid botFilePath and botFileSecret set for your environment.") </p>
  
  <p>I've checked and the .env is returning the right variables - console.log(process.env.botFileSecret) in the try/catch block returns the secret, and same for the filePath. But botConfig comes back as undefined here. Any ideas? Thank you! </p>