node recap
Figured I would whip up a quick blog post during lunch to mention some recent additions / releases to node projects.
Express Mongoose
Aaron recently released express-mongoose which is a fantastic plugin for any of you using Mongoose allowing you to pass query promises directly to res.render(), res.partial(), and `res.send() calls, deferring rendering until complete.
For example you may currently be nesting as shown below:
var News = db.model('News');
app.get('/dashboard', function (req, res, next) {
req.user.getLikes(function(err, likes){
if (err) return next(err);
News.getLatest(function(err, news){
if (err) return next(err);
res.render('dashboard', { likes: likes, latestNews: news });
});
});
});
well now you can simply pass the promises, next()ing exceptions. Much cleaner!
var News = db.model('News');
app.get('/dashboard', function (req, res) {
res.render('dashboard', {
likes: req.user.getLikes()
, latestNews: News.getLatest()
});
});
Asset
asset is a tiny but helpful utility written with node to manage assets such a JavaScript or css libraries. You could think of this as the homebrew or bundler of assets.
Installing assets is extremely simple, and by default will be installed to ./public. For example we can install g.raphael and g.pie to ./public/javascripts which will install the raphael dependency as well:
$ asset g.raphael g.pie -o public/javascripts
install : raphael@1.4.7
install : g.raphael@0.4.1
install : g.pie@0.4.1
download : raphael@1.4.7
complete : raphael@1.4.7 public/javascripts/raphael.js
download : g.raphael@0.4.1
complete : g.raphael@0.4.1 public/javascripts/g.raphael.js
download : g.pie@0.4.1
complete : g.pie@0.4.1 public/javascripts/g.pie.js
Last night I added a tiny patch which adds support for assets.json, which you can add to your project to list dependencies. For example this file might contain something like below
{
"g.raphael": "0.4.1"
, "jquery": "1.5.2"
, "modernizr": "1.7"
}
Which we can then install with a single command:
$ asset
install : g.raphael@0.4.1
dependency : raphael@1.4.7
install : raphael@1.4.7
install : jquery@1.5.2
install : modernizr@1.7
download : jquery@1.5.2
complete : jquery@1.5.2 public/jquery.js
download : raphael@1.4.7
complete : raphael@1.4.7 public/raphael.js
download : g.raphael@0.4.1
complete : g.raphael@0.4.1 public/g.raphael.js
download : modernizr@1.7
complete : modernizr@1.7 public/modernizr.js
Cluster updates
Cluster is a multi-process server manager for node. Recent additions now allow you to run cluster without a server, which is great for processing job queues! below is an example of how to utilize cluster for such a task:
var cluster = require('../');
var proc = cluster()
.set('workers', 4)
.use(cluster.debug())
.start();
if (proc.isWorker) {
var id = process.env.CLUSTER_WORKER;
console.log(' worker #%d started', id);
setInterval(function(){
console.log(' processing job from worker #%d', id);
}, 1000);
} else {
setTimeout(function(){
proc.close();
}, 10000);
}
Express Resource
For those of you who have been looking for resourceful routing for Express, you may have heard or express-resource already, and if not express-resource utilizes regular Express HTTP verb/pathname routing dressed up in an API better suited for resources.
Installation:
$ npm install express-resource
Below is an example use-case providing actions for forums and their associated threads. By calling forum.add(threads) routes such as GET /forums/:forum/threads/:thread and GET /forums/:forum/threads are mapped to action callbacks. This library also supports auto-loading of resources, providing them as req.forum, req.thread etc instead of manually doing this using the values of req.params.forum or req.params.thread.
var forum = app.resource('forum', actionsHere)
, threads = app.resource('thread', actionsHere)
forum.add(threads);
For more details check out the documentation and tests in the repo.
RedisKit
Week or so ago I started a small high-level redis library called rediskit. I started creating the lower level structures, and will be building up to composite structures and higher level abstractions.
Install with:
$ npm install rediskit
Example usage:
var list = new List('pets')
, client = list.client
, tobi = new Hash('pet:tobi')
, loki = new Hash('pet:loki')
, jane = new Hash('pet:jane');
list.rpush('tobi');
list.rpush('jane');
list.rpush('loki');
tobi.set('age', 1);
loki.set('age', 0.5);
jane.set('age', 3);
list.sort.by('pet:*->age').get('#').get('pet:*->age').end(function(err, res){
res.should.eql(['loki', '0.5', 'tobi', '1', 'jane', '3']);
});
RedBack
I also just saw a tweet about a similar library redback which is worth checking out if you are a redis fan.
Installation:
$ npm install redback
Usage:
var redback = require('redback').createClient();
//redback.create<Structure>(key)
var user1 = redback.createHash('user1');
user.set({username:'chris', password:'redisisawesome'}, callback);
var log = redback.createCappedList('log', 1000);
log.push('Log message ...');
var user3 = redback.createSocialGraph(3);
user3.follow(1, callback);