connect-url-pipe

1.0.1 • Public • Published

Connect-Url-Pipe

==================

Middleware for connect or express that allows for dynamic routing. Useful if in your app, /book/author and author/book are equivalent, or if you intend to have something like :string/toLowerCase/replace:a:b/append:!/

Usage

install:

npm install connect-url-pipe
var app = require('express')()
var urlPipe = require('connect-url-pipe');
 
var dynamicRoutes = {
    'toLowerCase':function(req,res,next){
        req.currentString = req.currentString.toLowerCase();
        next();
    }
,   'replace':function(req,res,next){
        var args = req.urlPipeOptions.$options;
        req.currentString = req.currentString.replace(args[0],args[1]);
        next();
    }
,   'append':function(req,res,next){
        var args = req.urlPipeOptions.$options;
        req.currentString = req.currentString+args[0];
        next();
    }
};
 
var dynamicRouter = urlPipe('options',dynamicRoutes);
 
app.use('/:string/:options(*)?',
    function(req,res,next){
        var str = req.param('string');
        if(str){req.currentString=str;}
        next();
    }
,   dynamicRouter
,   function(req,res,next){
        res.send(req.currentString);
    }
)
 
//http://localhost:3000/ABCDE/append:! -> ABCDE!
//http://localhost:3000/ABCDE/append:!/toLowerCase -> abcde!
//http://localhost:3000/ABCDE/replace:a:b/toLowerCase -> abcde
//http://localhost:3000/ABCDE/toLowerCase/replace:a:b -> bbcde
 

Connect-Url-Pipe adds an array-like object to req called urlPipeOptions.
For the dynamicRoutes above, req.urlPipeOptions will be:

{
    'toLowerCase':[function]
,   0:'toLowerCase'
,   'replace':[function]
,   1:'replace'
,   'append':[function]
,   2:'append'
,   'length':3
,   '$current':'toLowerCase'
,   '$index':0
,   '$options':null
,   '$errors':[]
}

Only the function names are enumerable, the numeric indices, length,$current, $errors and $index are not.

  • $current gives you the name of the current route
  • $index gives you the index of the current route (useful if you want to know if it's loaded before or after another module)
  • $options gives you the URL options provided.
  • $errors is an array of errors (if any)

Syntax

The default syntax is:
modulename[:arg[:arg]]/modulename...

But you can modify it by setting them in the constructor:

var dynamicRouter = urlPipe('options',dynamicRoutes,'/':':');

options is the name of the param to use. It depends on how you set up your url; since in our example, the url is /:string/:options(*)?, we use options.

If a module that doesn't exist is called, the process will be not be interrupted, but an array of errors will be passed to the next middleware.

app.get('/:path/:options(*)?',dynamicRoutes,function(req,res,next){
        if(req.urlPipeOptions.$errors.length){
            res.send(req.urlPipeOptions.$errors.join(',<br>'));
        }else{
            next();
        }
    })

Tests

No unit tests, but you can try the software by:

cd test
npm install express
node index.js

And going to http://localhost:3000


License

MIT

Readme

Keywords

Package Sidebar

Install

npm i connect-url-pipe

Weekly Downloads

1

Version

1.0.1

License

MIT

Last publish

Collaborators

  • xananax