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 + '!'); });