Is there a correct way to handle stream error in Nodejs

Viewed 50

I am trying to catch an error in the controller and send status(500) to the front-end to let the user know that there is a streaming error. But for some reason the error is not caught and I am sending status(200) to the user. Let me know if i am doing something wrong.

file - utils.js

import WebSocket from 'ws';
import Twitter from 'twitter-lite';
import ck from 'ckey';

export const stream = (term, clients, twitterStream) => {
  const twitter = new Twitter({
    // subdomain: 'api', // "api" is the default (change for other subdomains)
    // version: '1.1', // version "1.1" is the default (change for other subdomains)
    version: '2', // version "1.1" is the default (change for v2)
    extension: false, // true is the default (this must be set to false for v2 endpoints)
    consumer_key: ck.TWITTER_CONSUMER_KEY,
    consumer_secret: ck.TWITTER_CONSUMER_SECRET,
    access_token_key: ck.TWITTER_ACCESS_TOKEN_KEY,
    access_token_secret: ck.TWITTER_ACCESS_TOKEN_SECRET,
  });

  let stream = twitter.stream('statuses/filter', { track: term });

  stream.on('data', function (tweet) {
    console.log('tweetsJohn: ');
    broadcast(clients, JSON.stringify(tweet));
  });

  stream.on('error', function (error) {
    console.log('stream error: ', error.source);
  });

  twitterStream = stream;
  return twitterStream;
};

const broadcast = (clients, message) => {
  clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(message);
    }
  });
};

controller

import { stream } from './utils.js';

// Sets search term for twitter stream.
export const setSearchTerm = (req, res) => {
  try {
    const { term } = req.params;
    console.log('setSearchTerm');
    console.log('term: ', term);
    if (twitterStream) {
      console.log('getTweetPause');
      twitterStream.destroy();
    }
    twitterStream = stream(term, req.app.locals.clients, twitterStream);
    res.status(200).json({ message: 'Successful search request' });
  } catch (error) {
    res.status(500).json({ message: error });
    // res.status(500).json({ ex: 'Internal Server Errorr' });
  }
};

Solution

file-utils.js

import WebSocket from 'ws';
import Twitter from 'twitter-lite';
import ck from 'ckey';

export const stream = (clients, term) => {
  const twitter = new Twitter({
    // subdomain: 'api', // "api" is the default (change for other subdomains)
    // version: '1.1', // version "1.1" is the default (change for other subdomains)
    version: '2', // version "1.1" is the default (change for v2)
    extension: false, // true is the default (this must be set to false for v2 endpoints)
    consumer_key: ck.TWITTER_CONSUMER_KEY,
    consumer_secret: ck.TWITTER_CONSUMER_SECRET,
    access_token_key: ck.TWITTER_ACCESS_TOKEN_KEY,
    access_token_secret: ck.TWITTER_ACCESS_TOKEN_SECRET,
  });

  let currentStream = twitter.stream('statuses/filter', { track: term });

  const streamResult = new Promise((resolve, reject) => {
    currentStream.on('data', function (tweet) {
      console.log('tweets: ');
      broadcast(clients, JSON.stringify(tweet));
      resolve(tweet);
    });

    currentStream.on('error', function (error) {
      reject(error);
    });
  });

  return { currentStream, streamResult };
};

const broadcast = (clients, message) => {
  clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(message);
    }
  });
};

controller

import { stream } from './utils.js';

let twitterStream;

// Sets search term for twitter stream.
export const setSearchTerm = async (req, res) => {
  try {
    const { term } = req.params;

    console.log('setSearchTerm');
    console.log('term: ', term);

    if (twitterStream) {
      console.log('getTweetPause');
      twitterStream.destroy();
    }

    const { currentStream, streamResult } = stream(
      req.app.locals.clients,
      term
    );
    twitterStream = currentStream;

    await streamResult;

    res.status(200).json({ message: 'Successful HTTP request' });
  } catch (error) {
    console.log('error catch: ');
    res.status(500).json({ message: error });
  }
};
0 Answers
Related