app.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. var express = require('express');
  2. var request = require('request');
  3. var path = require('path');
  4. var favicon = require('serve-favicon');
  5. var logger = require('morgan');
  6. var cookieParser = require('cookie-parser');
  7. var bodyParser = require('body-parser');
  8. var sass = require('node-sass-middleware');
  9. var moment = require('moment');
  10. //设置时区
  11. var timezone = require('moment-timezone');
  12. //本地化
  13. moment.locale('zh-cn');
  14. //Welcome Page
  15. var welcome = require('./routes/welcome');
  16. //日志输出
  17. var logUtils = require('./utils/logUtils');
  18. //网易云音乐
  19. var netease = require('./routes/netease');
  20. //JsonBird version 1.0
  21. var v1 = require('./routes/v1');
  22. //test
  23. var test = require('./routes/test');
  24. var app = express();
  25. // view engine setup
  26. app.set('views', path.join(__dirname, 'views'));
  27. app.set('view engine', 'pug');
  28. app.enable('trust proxy');
  29. // uncomment after placing your favicon in /public
  30. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  31. app.use(logger('dev'));
  32. app.use(bodyParser.json());
  33. app.use(bodyParser.urlencoded({ extended: false }));
  34. app.use(cookieParser());
  35. //配置 sass
  36. app.use(sass({
  37. src: __dirname + '/static/sass',
  38. dest: __dirname + '/static/css',
  39. indentedSyntax: true,
  40. sourceMap: true
  41. }));
  42. //静态文件访问路径
  43. app.use('/static/', express.static(path.join(__dirname, 'static')));
  44. /***
  45. * 全局过滤,统计和日志
  46. */
  47. app.all('*', function(req, res, next) {
  48. res.header("Access-Control-Allow-Origin", "*");
  49. res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Access-Control-Allow-Origin");
  50. res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  51. res.header("X-Powered-By", '1.0.0');
  52. res.header("Vary", "Origin");
  53. var protocol = req.protocol;
  54. var host = req.hostname;
  55. var ip = req.ip.replace(/::ffff:/, '');
  56. var ref = req.headers.referer;
  57. var originalUrl = req.originalUrl;
  58. var logs = {
  59. IP: ip,
  60. Host: host,
  61. Referer: ref,
  62. //Protocol: protocol,
  63. OriginalUrl: originalUrl,
  64. Time: moment().tz('Asia/ShangHai').format('YYYY-MM-DD HH:mm:ss.ms')
  65. };
  66. /**
  67. * 不记录日志和统计的请求:
  68. * _detect 是 VeryCloud 探测机器人
  69. * *.css
  70. * favicon.ico
  71. * robots.txt
  72. * 图片文件
  73. * (JS文件可能有特殊统计需求,需要单独判断)
  74. */
  75. var filter = /_detect|\.css|favicon\.ico|robots\.txt|\.png|\.jpg|\.gif/i.test(originalUrl);
  76. if (!filter) {
  77. /**
  78. * console.log(req.query):
  79. * {
  80. * url: 'http://www.bing.com/HPImageArchive.aspx?format=js',
  81. * idx: '16',
  82. * n: '1'
  83. * }
  84. */
  85. //暂时屏蔽掉*.js日志的记录
  86. if (originalUrl.indexOf('.js') === -1) {
  87. //如果存在引用网址,则打印日志
  88. //if(!!logs['Referer'])
  89. logUtils.print(logs);
  90. }
  91. }
  92. next();
  93. });
  94. app.use('/', welcome);
  95. app.use('/test', test);
  96. app.use('/v1', v1);
  97. app.use('/netease', netease);
  98. // catch 404 and forward to error handler
  99. app.use(function(req, res, next) {
  100. var err = new Error('Not Found');
  101. err.status = 404;
  102. next(err);
  103. });
  104. // error handlers
  105. // development error handler
  106. // will print stacktrace
  107. if (app.get('env') === 'development') {
  108. app.use(function(err, req, res, next) {
  109. res.status(err.status || 500);
  110. res.send({
  111. data: {},
  112. status: {
  113. code: err.status,
  114. message: err.message
  115. }
  116. });
  117. });
  118. }
  119. // production error handler
  120. // no stacktraces leaked to user
  121. app.use(function(err, req, res, next) {
  122. res.status(err.status || 500);
  123. res.send({
  124. data: {},
  125. status: {
  126. code: err.status,
  127. message: err.message
  128. }
  129. });
  130. });
  131. module.exports = app;