{"id":1901,"date":"2015-01-14T13:15:23","date_gmt":"2015-01-14T11:15:23","guid":{"rendered":"http:\/\/www.webcodegeeks.com\/?p=1901"},"modified":"2015-03-25T15:28:50","modified_gmt":"2015-03-25T13:28:50","slug":"node-js-meets-net-edge-js","status":"publish","type":"post","link":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/","title":{"rendered":"Node.js Meets .NET \u2013 Edge.js"},"content":{"rendered":"<p>With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side applications using JavaScript as well. &nbsp;Node.js has become a popular choice for building server side applications using JavaScript because of its asynchronous event-driven model and many libraries and extensions that are available.<\/p>\n<p>But sometimes JavaScript is not the best choice for what you need to do, even in a Node.js application.<\/p>\n<p>There is package for Node.js that allows you to invoke .NET code in-process from a Node.js application \u2013 Edge.js.<\/p>\n<p><a href=\"http:\/\/tjanczuk.github.io\/edge\/#\/\" target=\"_blank\">Edge.js<\/a> is supported on Windows, Linux and OS X with .NET Framework 4.5 or Mono 3.4.0. &nbsp;Edge.js works with a variety of .NET languages including C#, F#, IronPython and LISP. &nbsp;It also works with T-SQL and Windows PowerShell. &nbsp;It was created by Tomasz Janczuk.<\/p>\n<p>Here are some reasons for using .NET with Node.js:<\/p>\n<ul>\n<li>Integrating\/reusing existing .NET components<\/li>\n<li>Accessing a SQL Server database using ADO.NET<\/li>\n<li>Using CLR threading for CPU intensive processing<\/li>\n<li>Writing native extensions to Node.js using a .NET language instead of C\/C++.<\/li>\n<li>Use your imagination\u2026You\u2019ll come up with something<\/li>\n<\/ul>\n<p>Installation is easy, just use the node package manager to run the command:<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">npm install edge<\/pre>\n<p>This installs the core Edge.js module with support for C#. &nbsp;Additional Edge.js modules are required for other languages:<\/p>\n<ul>\n<li>T-SQL: &nbsp;edge-sql<\/li>\n<li>F#: &nbsp;edge-fs<\/li>\n<li>LISP: &nbsp;edge-lsharp<\/li>\n<li>Windows Powershell: &nbsp;edge-ps<\/li>\n<li>IronPython: &nbsp;edge-py<\/li>\n<\/ul>\n<h2>Functions<\/h2>\n<p>The first thing you will probably want to do is create a JavaScript proxy to some C# code. &nbsp;In Edge.js, functions in C# are defined as Func &lt;object, task&lt;object&gt;&gt; where the first parameter is the input and the second parameter is the callback function. The edge.func() function will create the JavaScript proxy to the your C# code that can be executed synchronously or asynchronously from your Node.js code.<\/p>\n<p>I\u2019ll show how to do this with C# code inline with JavaScript, using a multi-line lamdba expression and a Startup class with an Invoke method. &nbsp;The downside of these methods are&nbsp;that you are writing code inside the comment block, so you don\u2019t get the benefits of intellisense and syntax checking. &nbsp;You can also reference a pre-compiled assembly or C# in a separate file. &nbsp;Both examples below show a reference to the Linq assembly but you can reference any external assemblies you need.<\/p>\n<h3>Multi-line Lambda<\/h3>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var edge = require('edge');\r\n\r\nvar add = edge.func(\r\n    {\r\n        source: function() {\/*\r\n            async (dynamic input) =&gt;\r\n\t     {\r\n\t         return (int)input.a + (int)input.b;\r\n\t     }\r\n\t  *\/},\r\n\t  references: &#x5B;'System.Linq.dll']\r\n    });\r\n\r\nadd({ a: 5, b: 10}, function (error, result) {\r\n\tconsole.log(result);\r\n});<\/pre>\n<h3>Startup Class With Invoke Method<\/h3>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var edge = require('edge');\r\n\r\nvar add = edge.func(\r\n    {\r\n        source: function() {\/*\r\n            using System.Threading.Tasks;\r\n\r\n            public class Startup\r\n            {\r\n                public async Task&lt;object&gt; Invoke(dynamic input)&lt;\/object&gt;\r\n                {\r\n                    int a = (int)input.a;\r\n                    int b = (int)input.b;\r\n                    return MathHelper.Add(a, b);\r\n                }\r\n            }\r\n\r\n            static class MathHelper\r\n            {\r\n                public static int Add(int a, int b)\r\n                {\r\n                    return a + b;\r\n                }\r\n            }\r\n        *\/},\r\n        references: &#x5B;'System.Linq.dll']\r\n    });\r\n\r\nadd({ a: 5, b: 10}, function (error, result) {\r\n    console.log(result);\r\n});<\/pre>\n<h3>Asynchronous vs. Synchronous Execution<\/h3>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\/\/ asynchronous execution with a callback\r\nadd({a: 10, b:20 }, function(error, result) {\r\n});\r\n\r\n\/\/ synchronous execution with a return value\r\nvar result = add({a: 10, b:20 }, true)<\/pre>\n<h2>Data Marshalling<\/h2>\n<p>Edge.js can marshal&nbsp;any JSON data between Node.js and .NET. &nbsp;JavaScript objects are represented as dynamics in .NET that can be cast to an IDictionary&lt;string, object&gt;. &nbsp;Arrays in JavaScript become object arrays in .NET. &nbsp;For binary data, a Node Buffer will get translated into a .NET byte array. &nbsp;When marshalling data from .NET back to Node.js, classes and anonymous types that are JSON serializable will both get converted to JavaScript objects. &nbsp;Be careful to avoid circular references in your object graphs as these will most likely result in a stack overflow.<\/p>\n<p>This example shows how you might pass data to a legacy component that would save an order. &nbsp;The Invoke method also returns an asynchronous function so the .NET code will run on a separate thread and not block Node.js.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">var edge = require('edge');\r\n\r\nvar submitOrder = edge.func({\r\n    source: function() {\/*\r\n        using System.Threading.Tasks;\r\n        using System.Collections.Generic;\r\n\r\n        public class Order\r\n        {\r\n            public string orderNumber { get; set; }\r\n            public int customerId { get; set; }\r\n            public double total { get; set; }\r\n            public List&lt;OrderItem&gt; items { get; set; }\r\n        }\r\n\r\n        public class OrderItem\r\n        {\r\n            public string name { get; set; }\r\n            public double price { get; set; }\r\n            public int quantity { get; set; }\r\n        }\r\n\r\n        public class Startup\r\n        {\r\n            public async Task&lt;object&gt; Invoke(dynamic input)\r\n            {\r\n                \/\/ returning the async function here\r\n                \/\/ allows the .NET code to run on a\r\n                \/\/ separate thread that doesn't block Node.js\r\n                return await Task.Run&lt;object&gt;(async () =&gt; {\r\n\r\n                    var order = new Order\r\n                    {\r\n                        orderNumber = System.DateTime.Now.Ticks.ToString(),\r\n                        customerId = (int)input.customerId,\r\n                        items = new List&lt;OrderItem&gt;()\r\n                    };\r\n\r\n                    dynamic &#x5B;] items = input.items;\r\n                    foreach (var item in items)\r\n                    {\r\n                        var orderItem = new OrderItem\r\n                        {\r\n                            name = (string)item.name,\r\n                            price = (double)item.price,\r\n                            quantity = (int)item.quantity\r\n                        };\r\n\r\n                        order.items.Add(orderItem);\r\n                        order.total += orderItem.price;\r\n                    }\r\n\r\n                    \/\/ ... invoke legacy code to save order here\r\n\r\n                    return order;\r\n                });\r\n            }\r\n        }\r\n    *\/},\r\n    references: &#x5B;'System.Collections.dll']\r\n});\r\n\r\nvar order = {\r\n    customerId: 1001,\r\n    items: &#x5B;\r\n        { name: 'XBox One Console', price: 329.95, quantity: 1 },\r\n        { name: 'Madden NFL 15', price: 49.95, quantity: 1}\r\n    ]\r\n};\r\n\r\nsubmitOrder(order, function (error, result) {\r\n    if (error)\r\n        console.log(error);\r\n    else\r\n        console.log(result);\r\n});<\/pre>\n<p>On Windows, you can debug .NET code in your Node.js applications. &nbsp;To debug C# code from a Node.js application, you first need to set the environment variable EDGE_CS_DEBUG=1. &nbsp;After starting node.exe, you simply attach your .NET managed code debugger to the node.exe process.<\/p>\n<p>Should you have a need to script Node.js code from a .NET app, there is also an Edge.js NuGet package that enables this.<\/p>\n<h2>Final Thoughts<\/h2>\n<p>As you can see, there is a lot of flexibility with using Edge.js as a interop layer between Node.js and .NET. &nbsp;If you are building Node.js apps and have existing .NET code you want to reuse (or find something you think would just be a lot easier\/quicker to code in .NET than JavaScript), you probably want to give Edge.js a try.<\/p>\n<p>For more information and examples, see <a href=\"https:\/\/github.com\/tjanczuk\/edge\/\" target=\"_blank\">https:\/\/github.com\/tjanczuk\/edge\/<\/a> and <a href=\"http:\/\/tjanczuk.github.io\/edge\" target=\"_blank\">http:\/\/tjanczuk.github.io\/edge<\/a><\/p>\n<p><\/p>\n<div class=\"attribution\">\n<table>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"https:\/\/keyholesoftware.com\/2014\/11\/29\/node-js-meets-net-edge-js\/\">Node.js Meets .NET \u2013 Edge.js<\/a> from our <a href=\"http:\/\/www.webcodegeeks.com\/wcg\/\">WCG partner<\/a> Keyhole Software at the <a href=\"http:\/\/keyholesoftware.com\/\">Keyhole Software<\/a> blog.<\/td>\n<\/tr>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side applications using JavaScript as well. &nbsp;Node.js has become a popular choice for building server side applications using JavaScript because of its asynchronous event-driven model and many libraries and extensions that are available. &hellip;<\/p>\n","protected":false},"author":22,"featured_media":924,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[64],"tags":[],"class_list":["post-1901","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-edge-js"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026<\/title>\n<meta name=\"description\" content=\"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side\" \/>\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.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026\" \/>\n<meta property=\"og:description\" content=\"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webcodegeeks\" \/>\n<meta property=\"article:author\" content=\"http:\/\/facebook.com\/keyholesoftware\" \/>\n<meta property=\"article:published_time\" content=\"2015-01-14T11:15:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-03-25T13:28:50+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Keyhole Software\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@http:\/\/twitter.com\/keyholesoftware\" \/>\n<meta name=\"twitter:site\" content=\"@webcodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Keyhole Software\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\"},\"author\":{\"name\":\"Keyhole Software\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\"},\"headline\":\"Node.js Meets .NET \u2013 Edge.js\",\"datePublished\":\"2015-01-14T11:15:23+00:00\",\"dateModified\":\"2015-03-25T13:28:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\"},\"wordCount\":1098,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg\",\"articleSection\":[\"Edge.js\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\",\"name\":\"Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026\",\"isPartOf\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg\",\"datePublished\":\"2015-01-14T11:15:23+00:00\",\"dateModified\":\"2015-03-25T13:28:50+00:00\",\"description\":\"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side\",\"breadcrumb\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.webcodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Edge.js\",\"item\":\"https:\/\/www.webcodegeeks.com\/category\/javascript\/edge-js\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Node.js Meets .NET \u2013 Edge.js\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#website\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"name\":\"Web Code Geeks\",\"description\":\"Web Developers Resource Center\",\"publisher\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.webcodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/www.webcodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webcodegeeks\",\"https:\/\/x.com\/webcodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2\",\"name\":\"Keyhole Software\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g\",\"caption\":\"Keyhole Software\"},\"description\":\"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.\",\"sameAs\":[\"http:\/\/keyholesoftware.com\/\",\"http:\/\/facebook.com\/keyholesoftware\",\"http:\/\/linkedin.com\/company\/keyhole-software\",\"https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware\"],\"url\":\"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026","description":"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side","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.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/","og_locale":"en_US","og_type":"article","og_title":"Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026","og_description":"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side","og_url":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/","og_site_name":"Web Code Geeks","article_publisher":"https:\/\/www.facebook.com\/webcodegeeks","article_author":"http:\/\/facebook.com\/keyholesoftware","article_published_time":"2015-01-14T11:15:23+00:00","article_modified_time":"2015-03-25T13:28:50+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg","type":"image\/jpeg"}],"author":"Keyhole Software","twitter_card":"summary_large_image","twitter_creator":"@http:\/\/twitter.com\/keyholesoftware","twitter_site":"@webcodegeeks","twitter_misc":{"Written by":"Keyhole Software","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#article","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/"},"author":{"name":"Keyhole Software","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2"},"headline":"Node.js Meets .NET \u2013 Edge.js","datePublished":"2015-01-14T11:15:23+00:00","dateModified":"2015-03-25T13:28:50+00:00","mainEntityOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/"},"wordCount":1098,"commentCount":0,"publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg","articleSection":["Edge.js"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/","url":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/","name":"Node.js Meets .NET \u2013 Edge.js - Web Code Geeks - 2026","isPartOf":{"@id":"https:\/\/www.webcodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage"},"image":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage"},"thumbnailUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg","datePublished":"2015-01-14T11:15:23+00:00","dateModified":"2015-03-25T13:28:50+00:00","description":"With so much JavaScript development on the client side, it only makes sense that developers and organizations would want to develop server side","breadcrumb":{"@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#primaryimage","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2014\/10\/nodejs-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.webcodegeeks.com\/javascript\/edge-js\/node-js-meets-net-edge-js\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.webcodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JavaScript","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/"},{"@type":"ListItem","position":3,"name":"Edge.js","item":"https:\/\/www.webcodegeeks.com\/category\/javascript\/edge-js\/"},{"@type":"ListItem","position":4,"name":"Node.js Meets .NET \u2013 Edge.js"}]},{"@type":"WebSite","@id":"https:\/\/www.webcodegeeks.com\/#website","url":"https:\/\/www.webcodegeeks.com\/","name":"Web Code Geeks","description":"Web Developers Resource Center","publisher":{"@id":"https:\/\/www.webcodegeeks.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.webcodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.webcodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.webcodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.webcodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webcodegeeks","https:\/\/x.com\/webcodegeeks"]},{"@type":"Person","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/10701460d97ebefdaf658a4f4535fff2","name":"Keyhole Software","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.webcodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/68be341bef51b95ced09befd6a7e0ca930461d95f3a64285e03e7925b8f5de47?s=96&d=mm&r=g","caption":"Keyhole Software"},"description":"Keyhole is a midwest-based consulting firm with a tight-knit technical team. We work primarily with Java, JavaScript and .NET technologies, specializing in application development. We love the challenge that comes in consulting and blog often regarding some of the technical situations and technologies we face.","sameAs":["http:\/\/keyholesoftware.com\/","http:\/\/facebook.com\/keyholesoftware","http:\/\/linkedin.com\/company\/keyhole-software","https:\/\/x.com\/http:\/\/twitter.com\/keyholesoftware"],"url":"https:\/\/www.webcodegeeks.com\/author\/keyhole-software\/"}]}},"_links":{"self":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/1901","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/comments?post=1901"}],"version-history":[{"count":0,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/posts\/1901\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media\/924"}],"wp:attachment":[{"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/media?parent=1901"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/categories?post=1901"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webcodegeeks.com\/wp-json\/wp\/v2\/tags?post=1901"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}