Archive

run shell from nodejs function

I have not inveted this one, but thought I share it. Here is how you can run shell commands from your node.js program:

var runShell = function(command){

	var sys = require('sys'),
			exec = require('child_process').exec;
	
	function puts(error, stdout, stderr) { 
		sys.puts(stdout); 
	}
	
	exec(command, puts);
}

// Example.
runShell('ls');

If you want to package this code into a module, it would look something like this:

// Usage:
// var sh = require('./shell');
// sh.run('ls');

exports.run = function(command){
	var sys = require('sys'),
			exec = require('child_process').exec;
	
	function puts(error, stdout, stderr) { 
		sys.puts(stdout); 
	}
	
	exec(command, puts);
}

nodejs mvc framework

I have been working a an nodejs MVC framework, which I was able to use to build a simple nodejs CMS. Here is a live demo: nodejsmvc.com.

There are a few frameworks out there already, but I wanted to have something really lightweight, so that I have flexibility to grow it the way I desire. Also, I wanted to create something similar in implementation as my JavaScript MVC framework.

Here is a example of my routing class:

var fs = require('fs'),
		c = require('../../config');

// Router.
exports.get = function(req, resp){

	var url = req.url.toLowerCase(),
			arr = url.split('/'),
			controller = 'page',
			action = 'index',
			p1 = '',
			p2 = '',
			p3 = '';
	
	try{

		// Routing.
		if(arr[1] === 'hypoteky'){
		
			var controller = 'hypoteky';
	
			if(arr[2]){
				p1 = arr[2];
				action = 'detail';
			}
		
		// Default route.
		} else {

			if(arr[1]){
				p1 = arr[1];
			}
		}

		// Load controller.
		var ctrl = require('../Controllers/' + controller);
		
		// Load view.
		fs.readFile(c.config.appPath + '/Views/' + controller + '/' + action + '.html', function (err, template) {

			if(template){
				view = template.toString();
			}
			
			// Load controller.
			ctrl.get({
					controller: controller,
					action: action,
					p1: p1,
					p2: p2,
					p3: p3
				},
				view,
				function(content){
					resp.writeHead(200, {'content-type': 'text/html'});
					resp.write(content);
					resp.end();
			});
		});
	} catch(ex){
		
		// Error page.
		resp.writeHead(200, {'content-type': 'text/html'});
		resp.write(ex);
		resp.end();	
	}
};

Here is an example of a controller:

var http = require('http'),
		tmpl = require('jqtpl'),
		fs = require('fs'),
		su = require('../lib/util.string'),
		ser = require('../lib/service'),
		c = require('../../config'),
		Mongolian = require("mongolian");

// Db.
var server = new Mongolian(c.config.dbConnection),
		db = server.db(c.config.dbName);
		
if(c.config.dbConnection !== 'localhost'){
	db.auth(c.config.dbUserName, c.config.dbPassword);
}

var hypoteky = db.collection("hypoteky"),
		zonesDb = db.collection("zones");
		
var zones = [];

var helpers = {
	htmlString: function(html){
	
		try {
			
			// Search zones.
			for(var i in zones) {
				html = html.replace('{zone:' + zones[i].key + '}', zones[i].content);
			}

		return html;
		} catch (ex){
			return ex;
		}
	}
};

// HTTP content getter.
exports.get = function(params, view, callBack){

	// Detail.
	if(params.p1 !== ''){
		
		fs.readFile(c.config.appPath + '/Models/hypSpiderKeys.js', function (err, data) {
			
			var keys = JSON.parse(data.toString());
			
			helpers.listParams = function(d){
				
				var sb = su.string.stringBuilder();
				
			  for (var i in keys) {
			  	if(d[keys[i].key]){
				  	sb.append(keys[i].name);
				  	sb.append(': ');
	    			sb.append(d[keys[i].key]);
	    			sb.append('
'); } } return sb.toString(); }; hypoteky.findOne({ url: params.p1 }, function(err, hypoteka) { zonesDb.find().limit(50).toArray(function (err, zonesList) { // Zone list. zones = zonesList; // Array to obj conversion. var zone = {}; for(var i in zones) { zone[zones[i].key] = zones[i].content; } var content = tmpl.tmpl(view, {hypoteka: hypoteka, zone: zone}, helpers); callBack(content); }); }); }); } else { // Hyp list. hypoteky.find().limit(300).toArray(function (err, hypotekaList) { zonesDb.find().limit(50).toArray(function (err, zonesList) { // Zone list. zones = zonesList; // Array to obj conversion. var zone = {}; for(var i in zones) { zone[zones[i].key] = zones[i].content; } var content = tmpl.tmpl(view, {hypoteky: hypotekaList, zone: zone}, helpers); callBack(content); }); //var content = tmpl.tmpl(view, {hypoteky: hypotekaList}); //callBack(content); }); } };

As a view engine, I use the tmpl port the nodejs.

jquery safari peek-a-boo bug when sliding flash

I saw in interesting bug recently, so I thought share this. If you try to slideDown a Flash movie or ad using the jQuery slideDown() method, Safari browser will not show the flash movie until you move your mouse or scroll the page. The solution: don't use slideDown(), use fade instead.