app.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. var express = require('express');
  2. var request = require('superagent');
  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 helmet = require('helmet');
  9. //Welcome Page
  10. var welcome = require('./routes/welcome');
  11. //日志输出
  12. var logUtils = require('./utils/logUtils');
  13. //查询ip
  14. var ip = require('./routes/ip');
  15. //网易云音乐
  16. var netease = require('./routes/netease');
  17. //JsonBird version 1.0
  18. var v1 = require('./routes/v1');
  19. //笑话接口
  20. var joke = require('./routes/joke');
  21. //手机号码归属地接口
  22. var mobile = require('./routes/mobile');
  23. //天气
  24. var weather = require('./routes/weather');
  25. //test
  26. var test = require('./routes/test');
  27. var app = express();
  28. //静态文件访问路径
  29. app.use('/', express.static(path.join(__dirname, 'static')));
  30. app.set('views', path.join(__dirname, 'views'));
  31. // view engine setup
  32. app.set('view engine', 'pug');
  33. app.enable('trust proxy');
  34. // uncomment after placing your favicon in /public
  35. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  36. app.use(logger('combined', {
  37. skip: function(req, res) { return res.statusCode < 400 }
  38. }));
  39. //app.use(bodyParser.raw({ type: '*/*' }));
  40. app.use(bodyParser.json());
  41. app.use(bodyParser.urlencoded({ extended: true }));
  42. app.use(cookieParser());
  43. app.use(helmet());
  44. app.use(favicon(__dirname + '/static/images/favicon.ico'));
  45. /***
  46. * 全局过滤:统计和日志
  47. */
  48. app.use(function(req, res, next) {
  49. res.header("Access-Control-Allow-Origin", "*");
  50. res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Access-Control-Allow-Origin");
  51. res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  52. var protocol = req.protocol;
  53. var host = req.hostname;
  54. var ip = req.headers['x-real-ip'] ? req.headers['x-real-ip'] : req.ip.replace(/::ffff:/, '');
  55. var ref = req.headers.referer;
  56. var originalUrl = req.originalUrl;
  57. var logs = {
  58. IP: ip,
  59. Host: host,
  60. Referer: ref,
  61. //Protocol: protocol,
  62. OriginalUrl: originalUrl,
  63. Time: new Date().toLocaleString(),
  64. params: JSON.stringify(req.body || req.query)
  65. };
  66. /**
  67. * 不记录日志和统计的请求:
  68. * *.css
  69. * favicon.ico
  70. * robots.txt
  71. * 图片文件
  72. * (JS文件可能有特殊统计需求,需要单独判断)
  73. */
  74. var filter = /_detect|\.css|favicon\.ico|robots\.txt|\.png|\.jpg|\.gif/i.test(originalUrl);
  75. if (!filter) {
  76. //暂时屏蔽掉*.js日志的记录
  77. if (originalUrl.indexOf('.js') === -1) {
  78. //如果存在引用网址,则打印日志
  79. //if(!!logs['Referer'])
  80. //暂时不需要打印
  81. //logUtils.print(logs);
  82. }
  83. }
  84. // 处理OPTIONS请求
  85. if (req.method === 'OPTIONS') {
  86. res.send(200);
  87. } else next();
  88. });
  89. //app.use('/', welcome);
  90. app.use('/test', test);
  91. app.use('/ip', ip);
  92. app.use('/v1', v1);
  93. app.use('/netease', netease);
  94. app.use('/joke', joke);
  95. app.use('/mobile', mobile);
  96. app.use('/weather', weather);
  97. /**
  98. * Robots.txt
  99. */
  100. app.use('/robots.txt', function(req, res, next) {
  101. res.header('content-type', 'text/plain');
  102. res.send('User-Agent: * \nAllow: /');
  103. });
  104. // catch 404 and forward to error handler
  105. app.use(function(req, res, next) {
  106. var err = new Error('Not Found');
  107. err.status = 404;
  108. next(err);
  109. });
  110. // error handlers
  111. // development error handler
  112. // will print stacktrace
  113. if (app.get('env') === 'development') {
  114. app.use(function(err, req, res, next) {
  115. res.status(err.status || 500);
  116. res.send({
  117. data: {},
  118. status: {
  119. code: err.status,
  120. message: err.message
  121. }
  122. });
  123. });
  124. }
  125. // production error handler
  126. // no stacktraces leaked to user
  127. app.use(function(err, req, res, next) {
  128. res.status(err.status || 500);
  129. res.send({
  130. data: {},
  131. status: {
  132. code: err.status,
  133. message: err.message
  134. }
  135. });
  136. });
  137. module.exports = app;