66a5977 Jul 14, 2014
@technoweenie @elecnix @kamarcum @ejfinneran @atmos
121 lines (90 sloc) 2.81 KB

Scoped HTTP Client for Node.js

Node.js's HTTP client is great, but a little too low level for common purposes. It's common practice for some libraries to extract this out so it's a bit nicer to work with.

function(method, path, customHeaders, body, callback) {
  var client = http.createClient(url)
  client.request(method, path, headers)
  // ...

I hate functions with lots of optional arguments. Let's turn that into:

var scopedClient = require('./lib')
  , util         = require('util')

var client = scopedClient.create('')
  .header('accept', 'application/json')
  .get()(function(err, resp, body) {

You can scope a client to make requests with certain parameters without affecting the main client instance:

client.path('') // reset path
client.scope('users/technoweenie', function(cli) {
  // cli's path is ""
  cli.get()(function(err, resp, body) {

// client's path is back to just ""

You can use .post(), .put(), .del(), and .head().

  .scope('users/technoweenie', function(cli) {
    var data = JSON.stringify({location: 'SF'})

    // posting data!, resp, body) {

Sometimes you want to stream the request body to the server. The request is a standard http.clientRequest. (req) {
})(function(err, resp, body) {
  // ...

And other times, you want to stream the response from the server. Simply listen for the request's response event yourself and omit the response callback.

client.get(function (err, req) {
  // do your own thing
  req.addListener('response', function (resp) {
    resp.addListener('data', function (chunk) {
      util.puts("CHUNK: " + chunk)

Basic HTTP authentication is supported:

client.get(function (err, req) {
  // we'll keep this conversation secret...
  req.auth('technoweenie', '...')

Adding simple timeout support:

client = ScopedClient.create('');


client.get()(function(err, resp, body) {
  if (err) {
    util.puts("ERROR: " + err);


Run this in the main directory to compile coffeescript to javascript as you go:

$ coffee -wc -o lib --no-wrap src/**/*.coffee


Copyright (c) 2014 rick. See LICENSE for details.