{"id":297,"date":"2015-06-03T12:36:27","date_gmt":"2015-06-03T10:36:27","guid":{"rendered":"http:\/\/blog.thecodecampus.de\/?p=297"},"modified":"2025-04-22T10:50:42","modified_gmt":"2025-04-22T08:50:42","slug":"client-side-errors-in-rich-internet-application-architectures","status":"publish","type":"post","link":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/","title":{"rendered":"Client-side Errors in Rich Internet Application-Architectures"},"content":{"rendered":"<h1>Problem<\/h1>\n<p>When building applications with frameworks like AngularJS, we usually create so called &#8220;Rich Internet Applications&#8221; (RIA). The architecture of a RIA differs from a &#8220;traditional&#8221; application in several aspects:<\/p>\n<ol>\n<li>The server is (almost) stateless<\/li>\n<li>The client is stateful<\/li>\n<li>Server and client communicate over a coarse-grained interface<\/li>\n<li>The client contains (more) business logic<\/li>\n<\/ol>\n<p>With good reason, AngularJS get&#8217;s hyped quite a lot and the blogosphere is full with articles explain how to implement a RIA architecture with AngularJS. AngularJS is particularly good at implementing e.g. the client state and business logic. Take for example the whole dependency injection mechanism and the support for test-driven development in the API.<\/p>\n<p>However, one important aspect often gets overlooked, simply because we, the developers, are not used it: <strong>Dealing with errors on the client side<\/strong>. Why are we not used to it? In old\/traditional architectures the <em>UI state<\/em> and <em>business logic<\/em> is is implemented on the server. Every (non-trivial) click, state transition, interaction etc. is handled on the server meaning unexpected errors, bugs, etc. are always caught and end up in our Logback\/SLF4J\/whatever log file. Often the default behavior is already enough (Servlet engine catches the error, Log library handles the error) and we rarely design this part of our application explicitly.<\/p>\n<p>Back to AngularJS. As stated above, writing applications in AngularJS means writing business logic and UI state in the client. What if your code contains an error? What if one of your dependencies contain an error? Well, we will never know (unless you call your users and ask them check the browser&#8217;s JavaScript console, of course).<\/p>\n<p><a href=\"https:\/\/www.thecodecampus.de\/schulungen\/angular\" style=\"display: inline-block;\">\n<picture><source srcset=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_big.png\" media=\"(min-width: 1024px)\"><source srcset=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_medium.png\" media=\"(min-width: 600px)\"><img decoding=\"async\" src=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_small.png\" alt=\"Angular Schulungen\" class=\"alignnone size-full wp-image-38\">\n<\/picture>\n<\/a><\/p>\n<h1>Solution<\/h1>\n<p>Closing this gap involves three tasks:<\/p>\n<ol>\n<li>Catching all errors on the client side<\/li>\n<li>Sending them to the server<\/li>\n<li>Logging them<\/li>\n<\/ol>\n<p>This blog article will concentrate on the first item. Implementing item two and three should be obvious. However, for the second item, instead of sending error messages to your server, you could use services like:<\/p>\n<ul>\n<li><a href=\"https:\/\/getsentry.com\/welcome\/\" target=\"_blank\" rel=\"noopener\">Sentry<\/a><\/li>\n<li><a href=\"http:\/\/jslogger.com\/\" target=\"_blank\" rel=\"noopener\">JSLogger<\/a><\/li>\n<\/ul>\n<p>These services are very nice and worth a look. However, I prefer to first collect all relevant log entries in one place and use a tool on top of this.<\/p>\n<h2>Catching AngularJS errors<\/h2>\n<p>Catching errors in AngularJS applications is quite simple due to the included dependency mechanism.<\/p>\n<h3>Option 1<\/h3>\n<p>The default module <em>ng <\/em>includes a <em>$log<\/em> service that is used by AngularJS itself and (hopefully) by your AngularJS libraries as well as your own code.\u00a0 Instead of writing something like<\/p>\n<pre class=\"lang:js decode:true \">console.log(\"error in ...\");<\/pre>\n<p>you would inject the <em>$log<\/em> service and write<\/p>\n<pre class=\"lang:default decode:true\">$log.error(\"error in ...\");<\/pre>\n<p>In AngularJS&#8217; DI framework, you can easily override a provided services. We can use this to override the default <em>$log<\/em> implementation and to provide a custom service which sends the error message to our server:<\/p>\n<pre class=\"lang:js decode:true\">angular.module('app').factory('$log', function ($window, $http) {\r\n    return {\r\n        log: function (message) {\r\n            $window.console.log(message);\r\n        },\r\n        info: function (message) {\r\n            $window.console.log(message);\r\n        },\r\n        warn: function (message) {\r\n             $window.console.log(message);\r\n        },\r\n        error: function (message) {\r\n            $http.post('errorHandler', message);\r\n            $window.console.log(message);\r\n        },\r\n        debug: function (message) {\r\n            $window.console.log(message);\r\n        }\r\n    };\r\n});<\/pre>\n<p>&nbsp;<\/p>\n<p>In the <em>error <\/em> function, we additionally send the message to our server.<\/p>\n<h3>Option 2<\/h3>\n<p>The disadvantage of option 1 is that we loose information about the error, e.g. the stack strace. The solution is too hook into AngularJS a bit deeper by decorating the <em>$exceptionHandler<\/em> service:<\/p>\n<pre class=\"lang:default decode:true\">angular.module('eh').config(function ($provide) {\r\n    $provide.decorator('$exceptionHandler',\r\n        function ($log, $delegate) {\r\n            return function (exception, cause) {\r\n                $http.post('errorHandler', createMessage(exception, cause));\r\n                $delegate(exception, cause);\r\n            };\r\n        });\r\n});\r\n<\/pre>\n<p>This allows us to process the exception message as well as the stack trace.<\/p>\n<h2>Catching generic JavaScript errors<\/h2>\n<p>Both options above work, because AngularJS takes care to catch the exceptions in our code. Possible sources are<\/p>\n<ul>\n<li>controller\/service\/directive construction function<\/li>\n<li>event handlers, e.g. ng-click<\/li>\n<li>callbacks in promises<\/li>\n<li>&#8230;<\/li>\n<\/ul>\n<p>However, everything that happens outside of an AngularJS digest cycle\/callback\/etc. can&#8217;t be intercepted. For example, this could be a DOM callback function registered with jQuery. Fortunately, JavaScript allows us to register a global error handler:<\/p>\n<pre class=\"lang:default decode:true\">window.onerror = function (msg, url, line) {\r\n    $.post(\"errorHandler\", createMessage(msg, url, line));\r\n    return false;\r\n};<\/pre>\n<p>The return code tells the Browser, if the error should be further processed (e.g. call the default handler).<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Problem When building applications with frameworks like AngularJS, we usually create so called &#8220;Rich Internet Applications&#8221; (RIA). The architecture of a RIA differs from a &#8220;traditional&#8221; application in several aspects: The server is (almost) stateless The client is stateful Server and client communicate over a coarse-grained interface The client contains (more) business logic With good [&#8230;]<br \/><a class=\"meta-big\" href=\"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/\"> READ MORE<\/a><\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,2],"tags":[62,61],"class_list":["post-297","post","type-post","status-publish","format-standard","hentry","category-angularjs","category-javascript","tag-angularjs","tag-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Client-side Errors in Rich Internet Application-Architectures - Web Development Blog<\/title>\n<meta name=\"description\" content=\"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Client-side Errors in Rich Internet Application-Architectures - Web Development Blog\" \/>\n<meta property=\"og:description\" content=\"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Development tips and tricks - theCodeCampus Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-06-03T10:36:27+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-04-22T08:50:42+00:00\" \/>\n<meta name=\"author\" content=\"Roman Roelofsen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Roman Roelofsen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/\"},\"author\":{\"name\":\"Roman Roelofsen\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/person\\\/941e9a6169bf8da015ed1f348177a22d\"},\"headline\":\"Client-side Errors in Rich Internet Application-Architectures\",\"datePublished\":\"2015-06-03T10:36:27+00:00\",\"dateModified\":\"2025-04-22T08:50:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/\"},\"wordCount\":615,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/schulungen-tcc_frieder_WP_small.png\",\"keywords\":[\"AngularJS\",\"JavaScript\"],\"articleSection\":[\"AngularJS 1\",\"JavaScript\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/\",\"name\":\"Client-side Errors in Rich Internet Application-Architectures - Web Development Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/schulungen-tcc_frieder_WP_small.png\",\"datePublished\":\"2015-06-03T10:36:27+00:00\",\"dateModified\":\"2025-04-22T08:50:42+00:00\",\"description\":\"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/schulungen-tcc_frieder_WP_small.png\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/04\\\/schulungen-tcc_frieder_WP_small.png\",\"width\":720,\"height\":400},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/client-side-errors-in-rich-internet-application-architectures\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Client-side Errors in Rich Internet Application-Architectures\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\",\"name\":\"Web Development tips and tricks - theCodeCampus Blog\",\"description\":\"Tips, tricks, and experiences about developing web and mobile applications with Angular, TypeScript, and Testing.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\",\"name\":\"theCodeCampus\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/TCC-Logo-Bildmarke-quadratisch.jpg\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/TCC-Logo-Bildmarke-quadratisch.jpg\",\"width\":156,\"height\":156,\"caption\":\"theCodeCampus\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/person\\\/941e9a6169bf8da015ed1f348177a22d\",\"name\":\"Roman Roelofsen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/roman-roelofsen-tcc-author-96x96.png\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/roman-roelofsen-tcc-author-96x96.png\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/roman-roelofsen-tcc-author-96x96.png\",\"caption\":\"Roman Roelofsen\"},\"description\":\"Roman Roelofsen is the technical managing director and responsible for the product development and technical direction of W11K GmbH. He is an expert in the development of complex web applications and has been working in the field of web engineering for 20 years. Roman supports our customers in the implementation of IT projects and has been working as a trainer for many years.\",\"sameAs\":[\"https:\\\/\\\/thecodecampus.de\\\/ueber-uns\\\/trainer\\\/roman-roelofsen\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/roman-roelofsen-91b2b35\\\/\"],\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/author\\\/rroelofsen\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Client-side Errors in Rich Internet Application-Architectures - Web Development Blog","description":"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/","og_locale":"en_US","og_type":"article","og_title":"Client-side Errors in Rich Internet Application-Architectures - Web Development Blog","og_description":"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.","og_url":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/","og_site_name":"Web Development tips and tricks - theCodeCampus Blog","article_published_time":"2015-06-03T10:36:27+00:00","article_modified_time":"2025-04-22T08:50:42+00:00","author":"Roman Roelofsen","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Roman Roelofsen","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#article","isPartOf":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/"},"author":{"name":"Roman Roelofsen","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/person\/941e9a6169bf8da015ed1f348177a22d"},"headline":"Client-side Errors in Rich Internet Application-Architectures","datePublished":"2015-06-03T10:36:27+00:00","dateModified":"2025-04-22T08:50:42+00:00","mainEntityOfPage":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/"},"wordCount":615,"commentCount":0,"publisher":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#organization"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#primaryimage"},"thumbnailUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_small.png","keywords":["AngularJS","JavaScript"],"articleSection":["AngularJS 1","JavaScript"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/","url":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/","name":"Client-side Errors in Rich Internet Application-Architectures - Web Development Blog","isPartOf":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#primaryimage"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#primaryimage"},"thumbnailUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_small.png","datePublished":"2015-06-03T10:36:27+00:00","dateModified":"2025-04-22T08:50:42+00:00","description":"Eliminate client-side errors! Enhance Rich Internet App architecture. Discover, resolve, and optimize for flawless user experiences.","breadcrumb":{"@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#primaryimage","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_small.png","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2025\/04\/schulungen-tcc_frieder_WP_small.png","width":720,"height":400},{"@type":"BreadcrumbList","@id":"https:\/\/www.thecodecampus.de\/blog\/client-side-errors-in-rich-internet-application-architectures\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.thecodecampus.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Client-side Errors in Rich Internet Application-Architectures"}]},{"@type":"WebSite","@id":"https:\/\/www.thecodecampus.de\/blog\/#website","url":"https:\/\/www.thecodecampus.de\/blog\/","name":"Web Development tips and tricks - theCodeCampus Blog","description":"Tips, tricks, and experiences about developing web and mobile applications with Angular, TypeScript, and Testing.","publisher":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.thecodecampus.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.thecodecampus.de\/blog\/#organization","name":"theCodeCampus","url":"https:\/\/www.thecodecampus.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/01\/TCC-Logo-Bildmarke-quadratisch.jpg","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/01\/TCC-Logo-Bildmarke-quadratisch.jpg","width":156,"height":156,"caption":"theCodeCampus"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/person\/941e9a6169bf8da015ed1f348177a22d","name":"Roman Roelofsen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/roman-roelofsen-tcc-author-96x96.png","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/roman-roelofsen-tcc-author-96x96.png","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/roman-roelofsen-tcc-author-96x96.png","caption":"Roman Roelofsen"},"description":"Roman Roelofsen is the technical managing director and responsible for the product development and technical direction of W11K GmbH. He is an expert in the development of complex web applications and has been working in the field of web engineering for 20 years. Roman supports our customers in the implementation of IT projects and has been working as a trainer for many years.","sameAs":["https:\/\/thecodecampus.de\/ueber-uns\/trainer\/roman-roelofsen","https:\/\/www.linkedin.com\/in\/roman-roelofsen-91b2b35\/"],"url":"https:\/\/www.thecodecampus.de\/blog\/author\/rroelofsen\/"}]}},"_links":{"self":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/297","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/comments?post=297"}],"version-history":[{"count":14,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":3459,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/297\/revisions\/3459"}],"wp:attachment":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/media?parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/categories?post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/tags?post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}