app.js 6.74 KB
require('app-module-path').addPath(__dirname);
const express = require('express');
const app = express();


//core 
var core = require('./utils/core');
// var stats = core.stats;
var log = core.log;
var constants = core.constants;
var conf = core.config;
core.init(app);

//helper
const utils = require('utils/utils');


//setup help build message resBody
function logResponseBody(req, res, next) {
  var oldWrite = res.write,
      oldEnd = res.end;

  var chunks = [];

  res.write = function (chunk) {
    chunks.push(chunk);
    oldWrite.apply(res, arguments);
  };

  res.end = function (chunk) {
    var body = '';

    if (typeof chunk !== 'string' && !(chunk instanceof Buffer)) {
        res["resBody"] = body ;
        oldEnd.apply(res, arguments);
        return ;
    }

    if (!(chunk instanceof String || typeof chunk === 'string' ) )
        chunks.push(chunk);
    try {
      //console.dir(chunks);
      body =  chunks.length > 0? Buffer.concat(chunks).toString('utf8')  :'';
    } catch (error) {
      logger.errorStack(error);
    }

    res["resBody"] = body ;
    
    oldEnd.apply(res, arguments);
  };

  next();
}
app.use(logResponseBody);

// setup json body parser
const bodyParser = require('body-parser');
app.use(bodyParser.json());

// Enable CORS
app.use(function (req, res, next) {
  // add generated request-id to session
  //req.session.reqId = req.id;
  // Enable CORS
  // res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Credentials", "true");
  res.header("Access-Control-Allow-Origin", req.headers.origin);
  res.header("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, OPTIONS");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});


// console.log(conf.get('redis.host'));


utils.test(1,2);

// setup generate request-id middleware
const addRequestId = require('express-request-id')();
app.use(addRequestId);

// setup express-session with redis store
const session = require('express-session');
// const RedisStore = require('connect-redis')(session);
const uuidV4 = require('uuid/v4');

// app.use(session({
//     genid: function(req) {
//         return uuidV4(); // generates session id using UUID
//     },
//     store: new RedisStore({
//         host: conf.get('redis.host'),
//         port: conf.get('redis.port'),
//         ttl: 180
//     }),
//     secret: 'dbc33e678f',
//     saveUninitialized: true,
//     resave: false,
//     cookie: { maxAge: 3600000 }
// }));

// setup logger
// const logger = require('utils/request-logger');

// setup express request/response logger
// const log4js = require('log4js');
// log4js.configure('./config/log4js_config.json');
// const log4jsLogger = log4js.getLogger('express-project');

// const fileTransport = logger.fileTransport;
// const expressWinston = require('winston-express-middleware');
// expressWinston.requestWhitelist.push('session');
// expressWinston.requestWhitelist.push('body');
// expressWinston.responseWhitelist.push('session');
// expressWinston.responseWhitelist.push('body');

// app.use(expressWinston.logger({
//     transports: [fileTransport],
//     meta: true, // optional: control whether you want to log the meta data about the request (default to true)
//     msg: "phoenix-partner - :: ## {{req.uid}} - {{req.id}} ## HTTP {{req.method}} {{req.url}} ",
//     //msg: "SID:[{{req.session.id}}] UID:[{{req.id}}] HTTP {{req.method}} {{req.url}} ", //request-body:{{JSON.stringify(req.body)}}", // -- response-body:{{JSON.stringify(res.body)}}", // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
//     expressFormat: false, // Use the default Express/morgan request formatting, with the same colors. Enabling this will override any msg and colorStatus if true. Will only output colors on transports with colorize set to true
//     colorStatus: true, // Color the status code, using the Express/morgan color palette (default green, 3XX cyan, 4XX yellow, 5XX red). Will not be recognized if expressFormat is true
//     ignoreRoute: function (req, res) { return false; }, // optional: allows to skip some log messages based on request and/or response,
//     customLogger: log4jsLogger,
//     filterOutList: ['dropdown', 'loggedin', 'query-table', 'query-last-package-number', '.png', '.woff', '.ttf', 'jquery.nanoscroller', 'favicon.ico'], // not log any messages that have one of these words
//     noExportData: true, // remove resultData in case message has '/export'
//     noHeader: true, // not log headers if true
//     noBody: false // not log body if true
// }));


// setup passport
// const passport = require('utils/passport-func')();
// const flash = require('connect-flash');
// app.use(flash());
// app.use(passport.initialize());
// app.use(passport.session());




//check header
app.use(function( req, res, next ) {
    if(req.headers["x-user"] && req.headers["usertoken"])
        next();
    else
        res.status(401).json({resultCode:40100,resultDescription:'Access denied'});
        
 });

//prepare incomming
app.use( function( req, res, next ) {
    log.startEC(req);
    req = utils.findQueryString(req);
    next();
  });

// get BE api configs
const apiUrlPrefix = conf.get('apiUrlPrefix');

let preference = require('./controllers/preference/index');
app.use(apiUrlPrefix+'/preference', preference);

//prepare outgoing
app.use( function( req, res, next ) {
    if(req.res.resBody)
    {
      try{
        log.logSummary(req,JSON.parse(req.res.resBody));
      } catch(err) {
        log.logSummary(req,req.res.resBody);
      }
      
    }else
    {
      var response = constants.RESPONSERESULT.UNKNOW;

      log.startlog(req,cmd,'session','identity');
      log.detailRequestFE(req);
      stat.receiveUnknow();
      log.addErrorSummary(req,"Unknow",req.method+"_"+"Unknow",result)      
      res.status(200).json(response);
      log.logSummary(req,response);
    }
    
    log.endEC(req,res);
    next();
} );




// handle not found
// app.all('*', function(req, res) {

//     var response = {resultCode: 40400,resultDescription: 'Data not found'};
//     log.endEC(req,response);    
//     res.status(404).send(response);

// });

// // handle errors
// app.use(function (err, req, res, next) {
//     // we may use properties of the error object
//     // here and next(err) appropriately, or if
//     // we possibly recovered from the error, simply next().
//     res.status(err.status || 500).send(err.message || err);
// });

// winston-express-middleware errorLogger makes sense AFTER the router.
// app.use(expressWinston.errorLogger({
//     transports: [fileTransport]
// }));

const appPort = conf.get('appPort');
app.listen(appPort, function () {
    console.log(conf.get('appName')+' listening on port ' + appPort + '!');
});