Node child_process and twitch api

I’m trying to create a simple script to run a few node files, these files are just api’s for a quote database , Authentication , and a twitch bot.

The Quote and Authentication work just find however they twitch bot does not it says its connected to the server but when it goes to execute any commands it gets a unhandled promise rejection or some such error

However when I run the twitch bot separately in its own terminal session and not from the script it works just fine with no thrown errors.

Why will it work from a separate session that I create but not from a child_process?

note: I have had the child_process start up a new shell and its still the same issue

The process script:

const exec = require('child_process').exec;
const spawn = require('child_process').spawn    


// I think twtich bot process has an issue without how much
//data is being passed to stdout or stderr and I need
//to specify how much data is allowed

twitchBot = exec('node ./twitchbot-api/index.js', 
function(error, stdout, stderr){
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if(error !== null){
        console.log('exec error: ' + error);
    }


})
twitchBot.stdout.on('data', (data) => {
 console.log(`twitchBot stdout:\n${data}`);
});

//whenver I recieve an error from quoteDataBase it also displays in the       parent process
twitchBot.stderr.on('data', (data) => {
 console.error(`twitchBot  stderr:\n${data}`);
});

//this throws an error the first time I try a command saying not  connected to server , I think I need to do this as exec
// let twitchBot = spawn('node ./twitchbot-api/index.js',{
//   stdio: 'inherit',
//    shell: true,
//    detached: true,
// })

// //twitchBot.unref();

// twitchBot.on('error', (error)=>{
//  console.log(`the erorr ${error}`)
// })




//starts up a child exec process for my quotes database
let quoteDataBase = exec('node ./quotes-api/index.js', 
function(error, stdout, stderr){
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if(error !== null){
        console.log('exec error: ' + error);
    }


})


//whatever the child exec process quoteDatabase pushs to the standard out (console) displays on the parent process 
// aka the terminal I run apiStart from
quoteDataBase.stdout.on('data', (data) => {
 console.log(`quoteDataBase stdout:\n${data}`);
});

//whenver I recieve an error from quoteDataBase it also displays in the  parent process
quoteDataBase.stderr.on('data', (data) => {
 console.error(`quoteDataBase  stderr:\n${data}`);
});


//starts up a child process for my user Authentication 
let AuthenDataBase = exec('node ./authen-api/index.js', 
 function(error, stdout, stderr){
    console.log('stdout: ' + stdout);
    console.log('stderr: ' + stderr);
    if(error !== null){
        console.log('exec error: ' + error);
    }


})

And then the twitch bot code:

const tmi = require('tmi.js')
const haikudos = require('haikudos')
require('dotenv').config()
require('es6-promise').polyfill();
require('isomorphic-fetch');
// Valid commands start with:
let commandPrefix = '!'
// Define configuration options:
let opts = {
 identity: {
   username: process.env.user,
   password: process.env.pass
},
channels: [
  "dshrops1"
]
}

// These are the commands the bot knows (defined below):
let knownCommands = { echo, haiku, quote }

// Function called when the "echo" command is issued:
function echo (target, context, params) {
// If there's something to echo:
if (params.length) {
// Join the params into a string:
const msg = params.join(' ')
// Send it back to the correct place:
sendMessage(target, context, msg)
} else { // Nothing to echo
 console.log(`* Nothing to echo`)
}
}

// Function called when the "haiku" command is issued:
function haiku (target, context) {
// Generate a new haiku:
haikudos((newHaiku) => {
// Split it line-by-line:
newHaiku.split('\n').forEach((h) => {
// Send each line separately:
sendMessage(target, context, h)
})
})
}

 async function quote (target, context){
  //cant deploy this on AWS yet Untill I deploy my database api as well.
  let quote = await fetch('http://localhost:3006/random').then(resp    =>resp.text())
  sendMessage(target,context,quote)
 }

// Helper function to send the correct type of message:
function sendMessage (target, context, message) {
if (context['message-type'] === 'whisper') {
client.whisper(target, message)
} else {
client.say(target, message)
}
}



// Create a client with our options:
let client = new tmi.client(opts)

// Register our event handlers (defined below):
client.on('message', onMessageHandler)
client.on('connected', onConnectedHandler)
client.on('disconnected', onDisconnectedHandler)

// Connect to Twitch:
client.connect()

// Called every time a message comes in:
function onMessageHandler (target, context, msg, self) {
if (self) { return } // Ignore messages from the bot

// This isn't a command since it has no prefix:
 if (msg.substr(0, 1) !== commandPrefix) {
   console.log(`[${target} (${context['message-type']})]        ${context.username}: ${msg}`)
  return
   }

// Split the message into individual words:
const parse = msg.slice(1).split(' ')
// The command name is the first (0th) one:
const commandName = parse[0]
// The rest (if any) are the parameters:
const params = parse.splice(1)

// If the command is known, let's execute it:
if (commandName in knownCommands) {
// Retrieve the function by its name:
const command = knownCommands[commandName]
// Then call the command with parameters:
command(target, context, params)
console.log(`* Executed ${commandName} command for ${context.username}`)
} else {
console.log(`* Unknown command ${commandName} from ${context.username}`)
}
}

// Called every time the bot connects to Twitch chat:
function onConnectedHandler (addr, port) {
console.log(`* Connected to ${addr}:${port}`)
}

// Called every time the bot disconnects from Twitch:
function onDisconnectedHandler (reason) {
console.log(`Womp womp, disconnected: ${reason}`)
process.exit(1)
}

Sorry About any formatting issues

Despite all the issues that might be wrong with the twitch bot it does work fine when I run it from a separate terminal I am curious as to why it does work from the script and what I can do.

notes: I figured it might have to do with the twitch api being a IRC.

Then you need to catch the rejection and log the error

For example this you always assume the fetch succeeds, you have to catch to catch an error.
You are also missing await and .then (which sure you can do but it can be confusing)

You’ll have to update your code to catch and log the error

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.