Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

i am getting internal server error while using the message action api in pubnub #357

Closed
saremhailem opened this issue Jan 15, 2024 · 1 comment

Comments

@saremhailem
Copy link

saremhailem commented Jan 15, 2024

I am using Pubnub for a chat feature I am building. I am trying to use the message actions API to add an action value to an already published message as described in the documentation found here message action api. But whenever I run my code I get the error below:

NOTE: I removed certain components from the error response because it contained sensitive data!

The error response:

{
  "error": true,
  "operation": "PNAddActionOperation",
  "statusCode": 500,
  "errorData": {
    "original": null,
    "response": {
      "req": {
        "method": "POST",
        "url": "https://ps18.pndsn.com/v1/message-actions/my_sub_key/channel/my_channel_name/message/17053072012353411?uuid=my_user_uuid&pnsdk=PubNub-JS-Web%2F7.4.5&l_hist=791&l_pres=1733",
        "data": {
          "type": "isRead",
          "value": true
        },
        "headers": {
          "content-type": "application/json"
        }
      },
      "xhr": {},
      "text": "<html>\r\n<head><title>500 Internal Server Error</title></head>\r\n<body bgcolor=\"white\">\r\n<center><h1>500 Internal Server Error</h1></center>\r\n<hr><center>nginx</center>\r\n</body>\r\n</html>\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n<!-- a padding to disable MSIE and Chrome friendly error page -->\r\n",
      "statusText": "Internal Server Error",
      "statusCode": 500,
      "status": 500,
      "statusType": 5,
      "info": false,
      "ok": false,
      "redirect": false,
      "clientError": false,
      "serverError": true,
      "error": {
        "status": 500,
        "method": "POST",
        "url": "https://ps18.pndsn.com/v1/message-actions/my_sub_key/channel/my_channel_name/message/17053072012353411?uuid=my_user_uuid&pnsdk=PubNub-JS-Web%2F7.4.5&l_hist=791&l_pres=1733"
      },
      "created": false,
      "accepted": false,
      "noContent": false,
      "badRequest": false,
      "unauthorized": false,
      "notAcceptable": false,
      "forbidden": false,
      "notFound": false,
      "unprocessableEntity": false,
      "headers": {
        "content-length": "588",
        "content-type": "text/html"
      },
      "header": {
        "content-length": "588",
        "content-type": "text/html"
      },
      "type": "text/html",
      "links": {},
      "body": null
    },
    "status": 500
  },
  "category": "PNUnknownCategory"
}

My JS Code:

let pubnub;

const pubnub_publish_key = 'demo'
const pubnub_subscribe_key = 'demo'

const user_id = 'test_user_id'

const my_channel_name = 'test_channel'

const setupPubNub = () => {
  // Initialize PubNub with the publish and subscribe keys and the current user's ID
  pubnub = new PubNub({
    publishKey: pubnub_publish_key,
    subscribeKey: pubnub_subscribe_key,
    userId: user_id,
    reconnectPolicy: 'linear'
  });

  await pubnub.subscribe({
    channels: [my_channel_name],
    presence: true,
  });
  
  fetchMessages(my_channel_name)

  const listener = {
    status: (statusEvent) => {
      if (statusEvent.category === "PNConnectedCategory") {
        console.log("Connected")
      }
    },
    message: (messageEvent) => {
      console.log(messageEvent)
    },
    presence: function(presenceEvent) {
      console.log(presenceEvent)
    }
  };

  pubnub.addListener(listener);
};

window.onload = setupPubNub;
window.onbeforeunload = (event) => {
  pubnub.unsubscribeAll();
}


// Asynchronous function to fetch messages from a channel
const fetchMessages = async(channelName) => {
  try {
    // Fetch messages from the channel
    await pubnub.fetchMessages({
      channels: [channelName],
      count: 100,
      stringifiedTimeToken: true,
    }, (status, response) => {
      if (status.error) {
        throw new Error(JSON.stringify(status));
      } else {
        // Encode the channel name (becaues it contains a colon)
        const encodedChannelName = encodeURIComponent(channelName)
        if (response) {
          // Get the messages from the response
          const messages = response.channels[encodedChannelName]

          // If there are messages
          if (messages) {
            // Wrap the loop in an async function
            (async() => {
              // For each message
              for (let i = 0; i < messages.length; i++) {
                let {
                  uuid,
                  timetoken,
                  message: {
                    text: messageText
                  }
                } = messages[i];

                //other code goes here to insert the message text and time to ket to the ui. Removed it becasue it doesn't matter for the error i am getting

                // If this is the last message
                if (i == messages.length - 1) {
                  let lastMessageTimetoken = messages[i] ? .timetoken

                  //logs the last message data properly
                  console.log(channelName, lastMessageTimetoken)

                  const isRead = messages[i].message ? .isRead ? true : await updateIsRead(channelName, lastMessageTimetoken);

                  console.log(isRead)
                }
              }
            })();
          }
        }
      }
    });
  } catch (error) {
    // Log any errors that occurred
    console.error(`Error in fetchMessages: ${error.message}`);
  }
}

//this is where i get the error
const updateIsRead = async(channelName, timetoken) => {
  if (typeof channelName !== 'string' || typeof timetoken !== 'string') {
    console.error('Invalid parameters');
    return;
  }
  await pubnub.addMessageAction({
      channel: channelName,
      messageTimetoken: timetoken,
      action: {
        type: 'isRead',
        value: true,
      },
    },
    function(status, response) {
      if (status.error) {
        return status
      } else {
        return response
      }
    }
  );
}
@saremhailem
Copy link
Author

saremhailem commented Jan 15, 2024

The error is caused in this snippet:

await pubnub.addMessageAction({
    channel: channelName,
    messageTimetoken: timetoken,
    action: {
      type: 'isRead',
      value: true,
    },
  },
  function(status, response) {
    if (status.error) {
      return status
    } else {
      return response
    }
  }
);

The problem is that all the values inside the action object should be a string. I used a boolean and that's what caused the issue. The documentation specifies that I should use a string value I overlooked. However, an internal server error response for this error is misinformative.

This fixes the issue:

await pubnub.addMessageAction({
        channel: channelName,
        messageTimetoken: timetoken,
        action: {
          type: 'isRead',
          value: 'true',
        },
      },
      function(status, response) {
        if (status.error) {
          return status
        } else {
          return response
        }
      }
    );

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant