Monday, 14 August 2017

A Review: Express in Action

Express in Action: Node applications with Express and its companion tools

By Evan Hahn
ISBN: 978-1617292422

This is another excellent JavaScript book from Manning. It contains a great introduction to Express.js and I wish I’d read it sooner as it explains a lot of things about Express.js and how to use it, as well as the tools surrounding it and Node.js, which I had previously worked out for myself. If you’re thinking of writing a web application, especially one in JavaScript, I recommend you read this book first.

The book is far from perfect. It could have been a lot shorter. There is a fair amount of repetition and the chatty style makes it overly verbose and irritating in many places.  The author tries to cover too much and goes beyond Express.js unnecessarily in a few places. However, given that, it’s still not a huge book and quite easy to read.

Sunday, 13 August 2017

A review: JavaScript the Good Parts

By Douglas Crockford
ISBN: 978-0596517748

Every JavaScript developer with a pre-existing working knowledge of JavaScript should read this book. JavaScript is a powerful and varied language, but it was developed in a hurry and there’s plenty wrong with it. This book outlines the good bits of the language and highlights the bad bits and the bits you should just avoid. There’s also a fair amount about the author’s JSLint project in the appendices.

This book was written in 2008 and probably needs updating. It’s hard going in places and the diagrams did little to nothing to help my understanding. I’ve come away still wondering about new and constructors, but I know I just need to review them again when I need them and it’ll get clearer.  I’m still not sure which function declaration syntax is best, but I’m not sure it matters too much.


Friday, 11 August 2017

Getting to the route of the problem

In 2016, Venkat Subramaniam wrote an incredible book called ‘Test-Driving JavaScript Applications’ which, along with JavaScript tools such as Mocha, Istanbul, Prettier and Eslint, have made me fall in love with JavaScript and Node.js (well for UI development anyway). JavaScript isn’t a proper language, right? For a long time I argued not, because the tools weren’t available to develop software with unit tests, static analysis and code coverage. This has changed and now I’m starting to take JavaScript seriously, even beyond jazzing up a web based UI. I’m almost over the lack of static typing.

I’m currently using Express.js, a web framework for Node.js, a lot and Venkat includes a section on testing Express.js routes in his book. They’re a bit like controllers in the Modal View Controllers pattern:

router.get('/', function(req, res, next) {
task.all(function(err, tasks) {
res.send(tasks);
});
});

Venkat’s example test looks like this:

it('should register uri / for get', function(done) {
    // ...        

    var registeredCallback = router.get.firstCall.args[1];
    registeredCallback(req, res);
});

I’ve left out some mocking and other boilerplate for brevity and so that we can concentrate on the one bit I don’t like. Venkat describes the test in full detail in his book.  Take another look at this line:

    var registeredCallback = router.get.firstCall.args[1];

What it does is get the second argument for the first get route declared with the router. That’s what is returned by firstCall, the first declared route. So if there is more than one get route declared with the router and at some point you change the order in which they are declared or you declare another get route in-between, the test will break. It’s brittle.

In fact it’s worse. To get the second get route you’d use secondCall and so on. So although it’s probably a very large number, there are a finite number of get routes you can get from the router with this method. For me this rang alarm bells.
Google suggested this is the way that everyone is doing it. It appears to be the standard practice. It doesn’t sit at all well with me. I’d much rather be able to look up route in the router by its path. After a while printing all sorts of things to the console to find out the data structures, I was able to develop this:

var rh = {
    findGet: function(router, path) {
        for (var i = 0; i < router.get.args.length; i++)
            if (router.get.args[i][0] === path)
                return router.get.args[i];

        return null;
    },

   // ..
};

module.exports = {
    execGet: function(router, path, req, res) {
        var get = rh.findGet(router, path);
        if (get != null) get[1](req, res);
    },

    // ..
};

The findGet function takes a router and the path to test and returns all of the arguments declared for that route or null if it’s not found.  The execGet function uses those arguments to execute the route, meaning that the test now becomes:

it('should register uri / for get', function(done) {
        // ...

        execGet(router, '/', req, res);
    });

Which is not only far more expressive, but less brittle and less code per test. It means that the declaration order of the routes for the router no longer matters. Of course similar functions can be added to facilitate testing post, put and delete.

I wanted to write this up as I couldn’t find any other solution with Google. Hopefully it will encourage developers to write more tests for Express routes as they become easier and less brittle.


NorDev: JavaScript Starter Kit – Beginners Full Day Workshop


Date: 9:00 am to 4:45 pm, Thursday 5th October 2017

Location: The King’s Centre, King Street, Norwich, NR1 1PH

Price: £50.00 per person

Level: Beginner

Prerequisites: Laptop with wifi, modern browser, text editor

RSVP: https://www.meetup.com/Norfolk-Developers-NorDev/events/242461849/

JavaScript is amazing.

It is a powerful, simple, infuriating, elegant and sometimes irrational programming language which was born in a hurry and can now do almost anything you can imagine. It can make whizzy websites, speak to databases, and draw maps, it can fly drones, make games, and build apps. You can run it on your watch or on your phone, on any web page or on hundreds of virtual servers.

And if you’re reading this you’re probably contemplating learning it.

This day-long workshop aims to cover enough ground to give you a broad base from which to start your quest. We’ll use plenty of practical exercises to explore the language. We’ll cover some of the tricky parts which often mystify people – especially handling asynchronous code, which is one of the language’s great strengths. We’ll spend most of our time in the browser, but we’ll also play around with node.js, JavaScript’s foremost server-side environment. There’ll be time to survey some of the different tools and frameworks which are popular with JavaScripters at the moment. As well as all this we’ll explore JavaScript’s history, its culture and community, and the factors behind its explosive growth. Perhaps most importantly we’ll introduce a set of resources which’ll help you continue your learning independently.

You’ll need to come equipped with a laptop, and you should have a modern browser installed, along with a text editor you’re comfortable using. You don’t need to have a lot of knowledge or experience to join in, though any familiarity with another programming language will help a lot.

There’s a lot to get into one day, so please bring lunch and Neontribe will be buying the first round in the pub straight after the workshop.

Rupert Redington

Rupert ran away from the theatre to become a web developer at the turn of the century. Since then he’s been making mistakes at Neontribe as fast as he can, learning from a reasonable percentage of them. Recently he’s been using Javascript to help teenagers talk to doctors, Americans to buy airline tickets and everybody to find their way to the loo.

“Rupert did a fine job of making this an entertaining subject and his enthusiasm for js was infectious.” – Matthew Shorten

“Thoroughly enjoyed it! Presenter was excellent. Would be interested in any other JS courses that he runs.” -Stephen Pengilley

“I’d certainly sign up for other courses Rupert hosts in a flash. This was an introduction and as such it was perfectly positioned (in my humble…), but if ever there’s an “intermediate” course which goes into more depth with core principles & real-world use of loops, arrays, functions & objects that would be great.” – Steve Harman