Express Generator pada Cloud Foundry Environment

Ketika membuat project dengan Node JS, akan sangat terbantu sekali dengan express generator, sehingga skeleton aplikasi generic-nya sudah digenerate terlebih dahulu. Apalagi jika menggunakan IDE Intellij IDEA atau webstorm, default generator dengan plugin Node JS adalah Express Generator.

Sejauh itu, tidak masalah. Aplikasi running seperti yang diharapkan.

Error muncul ketika aplikasi tersebut dijalankan di environment dengan Cloud Foundry. Akan terjadi error ketika aplikasi di-instance. Jika kamu periksa dengan cf cli tidak spesifik error yang dimaksud. Namun besar kemungkinan adalah port dan host yang digenerate express tidak sesuai dengan CF. Maka kita perlu merubah beberapa baris kode pada file bin\www menjadi seperti berikut (asumsi menggunakan Express generator) :

#!/usr/bin/env node
 
/**
 * Module dependencies.
 */
 
var app = require('../app');
var debug = require('debug')('your-app-name:server');
var http = require('http');
 
/**
 * Get port from environment and store in Express.
 */
 
var port = normalizePort(process.env.PORT || '3000');
app.app.set('port', port);
 
/**
 * Create HTTP server.
 */
 
var server = http.createServer(app.app);
 
/**
 * Listen on provided port, on all network interfaces.
 */
 
var cfenv = require('cfenv');
var appEnv = cfenv.getAppEnv();
 
server.listen(appEnv.port, appEnv.bind);
server.on('error', onError);
server.on('listening', onListening);
 
/**
 * Normalize a port into a number, string, or false.
 */
 
function normalizePort(val) {
  var port = parseInt(val, 10);
 
  if (isNaN(port)) {
    // named pipe
    return val;
  }
 
  if (port >= 0) {
    // port number
    return port;
  }
 
  return false;
}
 
/**
 * Event listener for HTTP server "error" event.
 */
 
function onError(error) {
  if (error.syscall !== 'listen') {
    throw error;
  }
 
  var bind = typeof port === 'string'
    ? 'Pipe ' + port
    : 'Port ' + port;
 
  // handle specific listen errors with friendly messages
  switch (error.code) {
    case 'EACCES':
      console.error(bind + ' requires elevated privileges');
      process.exit(1);
      break;
    case 'EADDRINUSE':
      console.error(bind + ' is already in use');
      process.exit(1);
      break;
    default:
      throw error;
  }
}
 
/**
 * Event listener for HTTP server "listening" event.
 */
 
function onListening() {
  var addr = server.address();
  var bind = typeof addr === 'string'
    ? 'pipe ' + addr
    : 'port ' + addr.port;
  debug('Listening on ' + bind);
}

Install cfenv :

npm install cfenv --save

Kemudian push kembali dengan cf cli. Baris yang kita rubah adalah ketika memilih port dan binding host yang harus disesuaikan dengan kebutuhan CF :

var cfenv = require('cfenv');
var appEnv = cfenv.getAppEnv();
server.listen(appEnv.port, appEnv.bind);