DEV Community

Andrew Elans
Andrew Elans

Posted on

1 1 1

Power Automate: format JavaScript error object for email

In my Power Pages portal project I would need to be notified on user client-side errors. I will later make an extensive thread on how I implement this, but this post is how to format a typical error object that comes from the JavaScript catch handler.

Typical flow

1) Error is caught in JavaScript code
2) Error object is prepared with all client-side details
3) Power Automate flow is triggered where email with the error details is sent to the admin

Error object

Let's now make a dummy Error object:

console.dir(
    new Error(
        'Smth went wrong'
        , {
            cause: {
                desc: "some descrtion here",
                comments: "some comments here",
                someObj: {
                    newProp: "new value"
                },
                someArr: [
                    {name: "name1", value: "value1"},
                    {name: "name2", value: "value2"}
                ]
            }
        }
    )
)
Enter fullscreen mode Exit fullscreen mode

We would get the following error that we would need to send by email:

Image description

We will send this object to Power Automate in the request body as follows:

fetch(              
    url
    , {
        method: "POST",
        body: JSON.stringify(
            {
                wb_data: JSON.stringify(
                    {
                        desc: "some description here",
                        comments: "some comments here",
                        someObj: {
                            newProp: "new value"
                        },
                        someArr: [
                            {name: "name1", value: "value1"},
                            {name: "name2", value: "value2"}
                        ]
                    }
                )
            }
        )
    }
)
Enter fullscreen mode Exit fullscreen mode

Result in the email body will be rendered in one line and look like this:

{"desc":"some description here","comments":"some comments here","someObj":{"newProp":"new value"},"someArr":[{"name":"name1","value":"value1"},{"name":"name2","value":"value2"}]}
Enter fullscreen mode Exit fullscreen mode

That is not what I want.

How to fix

We need to use the space parameter when doing JSON.stringify

Let's redo the logic:

fetch(              
    url
    , {
        method: "POST",
        body: JSON.stringify(
            {
                wb_data: JSON.stringify(
                    {
                        desc: "some description here",
                        comments: "some comments here",
                        someObj: {
                            newProp: "new value"
                        },
                        someArr: [
                            {name: "name1", value: "value1"},
                            {name: "name2", value: "value2"}
                        ]
                    }
                    , null
                    , ' ' // this is a space separator that is rendered in Outlook HTML tags as a visual space
                ).replaceAll('\n', '<br>') // when applying the space param, '\n' is added automatically which we need to convert to new line for HTML
            }
        )
    }
)
Enter fullscreen mode Exit fullscreen mode

Space characters that work in Outlook:

  • Em Space &emsp; - widest of all, but when pasted from outlook into vscode will be replaced with a square symbol invalidating json
  • No-Break Space &#160; - narrow but when pasting into vs code will be replaced with a normal space making valid json -> I will finally use this for production with some modification:

    • I would like to use 4 spaces instead of 1 (my typical setting in the code editor), but since the fetch space param has a limit of 10 characters, I cannot use &#160;&#160;&#160;&#160;
    • instead, I will replace it after
    • so the above line .replaceAll('\n', '<br>') will be replaced with .replaceAll('\n', '<br>').replaceAll('&#160;', '&#160;&#160;&#160;&#160;')
    • as a result I will have 4 spaces rendered and when pasting the json from the email body into vs code (in case I need it), I don't even need to format
  • some other spaces

Space characters that do not work in Outlook:

  • Zero Width Space &#8203;
  • Space (SP) &#32;
  • Tab &#9;

Result

Actual string that will be sent to the email body will look like this:

'{"wb_data":"{<br>&emsp;\\"desc\\": \\"some description here\\",<br>&emsp;\\"comments\\": \\"some comments here\\",<br>&emsp;\\"someObj\\": {<br>&emsp;&emsp;\\"newProp\\": \\"new value\\"<br>&emsp;},<br>&emsp;\\"someArr\\": [<br>&emsp;&emsp;{<br>&emsp;&emsp;&emsp;\\"name\\": \\"name1\\",<br>&emsp;&emsp;&emsp;\\"value\\": \\"value1\\"<br>&emsp;&emsp;},<br>&emsp;&emsp;{<br>&emsp;&emsp;&emsp;\\"name\\": \\"name2\\",<br>&emsp;&emsp;&emsp;\\"value\\": \\"value2\\"<br>&emsp;&emsp;}<br>&emsp;]<br>}"}'
Enter fullscreen mode Exit fullscreen mode

Actual email body in Outlook will look like this:

{
"desc": "some description here",
"comments": "some comments here",
"someObj": {
  "newProp": "new value"
},
"someArr": [
  {
   "name": "name1",
   "value": "value1"
  },
  {
   "name": "name2",
   "value": "value2"
  }
]
}

Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
balagmadhu profile image
Bala Madhusoodhanan

Thanks for sharing

This post blew up on DEV in 2020:

js visualized

🚀⚙️ JavaScript Visualized: the JavaScript Engine

As JavaScript devs, we usually don't have to deal with compilers ourselves. However, it's definitely good to know the basics of the JavaScript engine and see how it handles our human-friendly JS code, and turns it into something machines understand! 🥳

Happy coding!

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay