コードスニペットUseful pieces of code

複数のワーカーを持つrailwayサーバー(node 0.6.0)

coffeescriptのサンプル:

server.coffee

#!/usr/bin/env coffee

app = module.exports = require('railway').createServer()

cluster = require('cluster')
numCPUs = require('os').cpus().length

port = process.env.PORT or 3000

if not module.parent
    if cluster.isMaster
        # Fork workers.
        cluster.fork() for i in [1..numCPUs]

        cluster.on 'death', (worker) ->
            console.log 'worker ' + worker.pid + ' died'
    else
        # Run server
        app.listen port
        console.log "Railway server listening on port %d within %s environment", port, app.settings.env

heroku開発でのredistogoアドオンを使用したRedisセッションストア

config/environment.jsの環境変数REDISTOGO_URLをフックして、Redisストアのコンストラクタを渡します。

var express    = require('express'),
    RedisStore = require('connect-redis')(express);

var redisOpts;
if (process.env['REDISTOGO_URL']) {
    var url = require('url').parse(process.env['REDISTOGO_URL']);
    var redisOpts = {
        port: url.port,
        host: url.hostname,
        pass: url.auth.split(':')[1]
    };
} else {
    redisOpts = {};
}

app.configure(function(){
    var cwd = process.cwd();
    app.use(express.static(cwd + '/public', {maxAge: 86400000}));
    app.set('views', cwd + '/app/views');
    app.set('view engine', 'ejs');
    app.set('jsDirectory', '/javascripts/');
    app.set('cssDirectory', '/css/');
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.session({secret: 'secret', store: new RedisStore(redisOpts)}));
    app.use(express.methodOverride());
    app.use(app.router);
});

railwayサーバーへのファイルアップロード

var form = require('connect-form-sync');
app.configure(function(){
    ....
    app.use(form({ keepExtensions: true }));
    app.use(express.bodyParser());
    ....
});

コントローラで以下のようにして使います。

action('create', function () {
    this.file = new File();
    var tmpFile = req.form.files.file;
    this.file.upload(tmpFile.name, tmpFile.path, function (err) {
        if (err) {
            console.log(err);
            this.title = 'New file';
            flash('error', 'File can not be created');
            render('new');
        } else {
            flash('info', 'File created');
            redirect(path_to.files);
        }
    }.bind(this));
});