37 comments

[ 5.1 ms ] story [ 94.2 ms ] thread
When I read about Node.js, the first selling point people mention is how you can reuse code on the client and server sides. For me, the main selling point is that it's Javascript. When I see new variants of js, developed to "fix" js, it makes me want to cry.
I think there's a difference between languages designed to compile down to JS (e.g. CoffeeScript) and wanting to convert a completely different language (e.g. Ruby or C#) into JS.

JavaScript has a lot of good and bad parts, and given we don't really have an option of choosing to use something else in its place I strongly believe that (some) languages that compile to JS have their place. While I don't believe all of them are useful (i.e. dart, typescript) they're specifically targetted as an alternative to JavaScript.

If you're trying to convert a different programming language, that isn't based around the way JavaScript does things then I firmly believe you're doing something wrong. JavaScript isn't just remembering that the semi-colon is optional and that JSON is wonderful. While other languages support event driven behaviour, JavaScripts implementation is (probably) different meaning there's still a learning curve. The documentation for Node.js is, unsurprisingly in JS. The libraries are JS. The whole ecosystem is JS. At least with CoffeeScript quite a few libraries have their source as .coffee, and the style of programming is identical to the compiled JS.

Currently, reusing code on client and server is far from the first selling point. Companies like Meteor and Groupon are pushing in that direction quite heavily, but for mere mortals it's still limited to reusing a few core libraries like underscore, async or templating.

Reusing experience and knowledge, and reducing the cost of context switching, those are very clear and positive advantages.

On the topic of sharing code, these should be interesting: the 'pipe dream' ( http://keithnorm.com/spainjs-pipedream/ ) and the 'holy grail' ( http://thatconf.chrisjpowers.com/ ).

As an aside, http://thatconf.chrisjpowers.com/ features what I will give my "Annoying Hipster Presentation Style Of The Month" award. Can't we just have information without all the JS supa-awesumness, just because we can?!?!
Thanks for the "pipe dream" link, I found the conference talk on youtube and enjoyed it a lot. The reusable code 'function' of node is still too non-obvious to achieve without the right mix of tools and this talk gave a nice intro for a solution.
What exactly is the point here? If you want to write C#, just use ASP.NET and MVC 4. You will certainly save yourself a lot of headaches, and you can still do everything async, etc. From what I can tell, the purpose of Node.js is to reduce the number of technologies that a web dev has to use and understand. You already need to use JavaScript on the client side, so using the same thing on the server side allows code reuse, knowledge sharing, etc.

It seems like what the author really wants is ASP.NET on the server, and Script# on the client side. Then the whole stack is C#. Or perhaps he would find TypeScript an acceptable middle-ground on the client. But I don't understand why you would choose Node.js on the server if you hate JavaScript, does not compute.

Reason to use Node.js on the server without liking Javascript: I like the framework. Framework != language (or at least it should be).
Sidenote: Node.js isn't a framework, it's a platform.
I'm genuinely curious which feature(s) of node you like better than ASP.NET. I have used both and find them quite similar as far as "raw" capability. ASP.NET however has all of the things you were asking for: great Intellisense, great tooling (for instance integration with Entity Framework), great libraries available (such as SignalR), code in C# or any .NET language (including F#), rich async support...

I like node too, but to me, the reason to choose it is either if you want to remain platform-neutral, or if you really like Javascript.

I would imagine he's referring to the non-blocking IO and evented model. ASP.Net and friends use threads for everything, which allows for heavier processing, but also is more restrictive in terms of concurrency.
MVC 4 also allows non-blocking IO. Mark your controller as "async" and use async calls within your controller method.

The evented IO model is nice, but nothing earth shattering. Same can again be accomplished with async IO calls, which are trivially easy in .NET 4.5.

MVC is actually pretty damn clunky. It has a lot of built-ins which are just frustrating (like IPrincipal, ugh). Also there are loads and loads of weird quirks that pop up as soon as you start trying to do anything like returning JSON.

MVC was a huge step forward from the old ASP.Net, but it's still making a lot of frankly odd decisions or suddenly bizarre behaviours in the background (e.g. http://stackoverflow.com/questions/1975983/how-can-i-disable...)

I think one of the reasons node.js is so great is that it just cuts out almost everything and gives you direct control over what is returned. MVC still mucks around with everything trying to be 'helpful' as it's really built on ASP.Net in the background.

To many of us, javascript is still one of the worst mainstream language around today.

Still, why not just make node.cs instead one wonders? Perhaps the existing ecosystem.

(comment deleted)
I personally find those "helpful" things to be truly, well, helpful. For example the input validation, anti-forgery token validation, simple cache control, etc.

Again, not saying you can't do these things in node. The two technologies can easily accomplish the same goal. But if your primary concern is avoiding JS, why would you choose a technology that is built entirely upon it?

Node.cs might make more sense, I agree. I have a feeling the existing ecosystem might bring its own problems with the author's approach, because your C# code may have trouble integrating with those existing libraries, if the underlying generated code does not behave as the Javascript library expects.

can you elaborate on the quirks around returning JSON with asp.net MVC? its a pretty common usecase.
There's a load of little things that are gotchas, but an example that pops into my head is that it wasn't compatible with default jQuery for example. If you didn't ask specifically for a content-type of application/json, which jQuery didn't by default, it would throw a hissy fit. It meant mucking around with the ajax object meaning you couldn't use certain jQuery shortcut methods. Regardless of what you 'told' MVC to do.

So there's a bunch of things it's doing you're not even aware that it is nor have asked it to do.

Think that was MVC 3? I've been using it since the first version, it's much better than it started (the original JSON support was awful), but you still every now and then get a WTF moment.

For example I still really have no idea the 'right' way to return 404 or 500 error pages. I swear they change their mind every release.

By default MVC 4 will return JSON so you don't need to specify the content-type unless you want something that isn't JSON.
It's not the return type, it was the request type. It didn't like if you requested it with plain/text instead of application/json. Which was jQuery's json method's default.
plain/text gives you JSON in MVC 4. I understood what you were saying, the default in MVC 4 is now to return JSON unless you specify otherwise.
Yeah, but this is my whole point. Finally in version 4 they stop mucking around with the requests before they give it to you. Someone, somewhere in the depths of MS clearly believe they understand HTTP better than you do. And keep guessing what you really 'meant'.

Even though they quite clearly don't understand and actually really don't get HTTP. For example take the fact that it's nigh impossible to get the actual request body in ASP.Net. Who's bright idea was that?

In reality every single interface, every single framework they've produced so far has shown a woeful lack of understanding about the web in general and pretty much how it's used outside their world. And I say this as someone who's primarily programmed in VBScript, VB6, C#, Silverlight, ASP.Net and ASP.Net MVC.

I keep almost jumping ship and then they just kinda fix it and I stick around hoping they're not going to make the same mistakes. But they do, jeesus, MVCs ajax stuff is unsurprisingly fucking awful.

But that's the problem with MVC and anything MS led, they don't get the web, they don't get javascript, they keep making incredibly silly decisions.

A good example. Every time I hear 'unobtrusive' js, I just want to scream. They're the cause of this made up problem. No-one else was doing js like that in 2010, no-one else needed unobtrusive javascript. Just MS. There's no such thing as unobtrusive javascript, there's just not writing idiotic magic code like a fucking retard like MS constantly do when it comes to javascript.

And don't even get me started on their 'web services' or WCF. Both deserve to die in a fire.

TL;DR; I love C#, think it's the best language available today by far. I hate asp.net though.

The biggest thing I can think of is how it defaults to throwing an exception when attempting to return JSON for a GET request. You could disable this easily enough, but I never understood the rationale behind the decision, and it was a momentary frustration every single time. Hopefully they've changed that in MVC 4.
What's wrong with IPrincipal, which btw is a .NET, not MVC thing?
There is already a node.js analogue that runs on .net and hosts .net https://github.com/jacksonh/manos

Hasn't been updated in a long time. Not sure why it isn't getting any love, maybe something better came along. Seems to me it should be more performant on equal hardware.

I can't believe Javascrip is really that awful that anyone would rather go through all this trouble, rather than just write JS..

Maybe it has more to do with people being to reliant on IDE's, which he, kind of, admits to anyway..

I can't believe that any IDE is that great that anyone would rather go through all this trouble, rather than just use something else..

I think in this case, it isn't about being dependent on Visual Studio, but C#.
The two go hand in hand. Aside from a very small cross section of Mono users, most C# users are very dependent on Visual Studio.
IMO JavaScript is that awful, but I still don't understand why you wouldn't just use Go or C# or whatever natively on the backend. There are lightweight frameworks similar in concept to node for virtually every language out there.

I understand why people write JavaScript translators for the browser -- there you're (unfortunately) stuck with JavaScript there is no other option. I also understand why people who do like JavaScript use node. Even though I'm not a fan of JavaScript, there is certainly some benefit to keeping a project all in one language. But if you're the type of person that wants to avoid JavaScript in the first place, why start off in a situation where you already have an overly complicated language-to-language transpiler situation on the backend?

It strikes me that there's a much simpler solution, and that is to use TypeScript. It has all the VS intellisense that's required and none of the boilerplate in the OP's solution.

http://www.typescriptlang.org

May want to take a look at ServiceStack, nice lightweight alternative to MVC with an extensive architecture providing for super easy and high performance ORM, JSON/JSV serialization/de-serialization, POCO DTO's with no-effort endpoints!

http://www.servicestack.net/

One of the key benefits of node.js is that people who are great with JS can write server code and you have one language stack less to worry about. You can with that (watch for security issues) also share code & objects between the server and browser.

Can't see how this fits into that.

"JavaScript is the only language people feel like they don't need to learn to use." -- Crockford
Not more than month ago when this project was announced people were praising it. (No wonder, it features a fairly complete subset of C# - it's free and open source, it works and it's great - mad props to the creator keep up the good work!) Now when the author presents a use case people are throwing rocks. (At least this is my impression by reading some of the comments). I don't know about you, but I feel bad about it. It's the same story everytime a topic of compiling to JS is brought up. The JS "crowd" steps in with their "wisdom" of why it's a bad idea to do "X" and all they do is criticize...