app.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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. //var sass = require('node-sass-middleware');
  10. //Welcome Page
  11. var welcome = require('./routes/welcome');
  12. //日志输出
  13. var logUtils = require('./utils/logUtils');
  14. //查询ip
  15. var ip = require('./routes/ip');
  16. //网易云音乐
  17. var netease = require('./routes/netease');
  18. //JsonBird version 1.0
  19. var v1 = require('./routes/v1');
  20. //笑话接口
  21. var joke = require('./routes/joke');
  22. //手机号码归属地接口
  23. var mobile = require('./routes/mobile');
  24. //天气
  25. var weather = require('./routes/weather');
  26. //test
  27. var test = require('./routes/test');
  28. var app = express();
  29. //引入LeanCloud
  30. // var AV = require('leanengine');
  31. // AV.init({
  32. // appId: process.env.LEANCLOUD_APP_ID,
  33. // appKey: process.env.LEANCLOUD_APP_KEY,
  34. // masterKey: process.env.LEANCLOUD_APP_MASTER_KEY
  35. // });
  36. // app.use(AV.express());
  37. app.set('views', path.join(__dirname, 'views'));
  38. // view engine setup
  39. app.set('view engine', 'pug');
  40. app.enable('trust proxy');
  41. // uncomment after placing your favicon in /public
  42. //app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
  43. app.use(logger('dev'));
  44. app.use(bodyParser.json());
  45. app.use(bodyParser.urlencoded({ extended: false }));
  46. app.use(cookieParser());
  47. app.use(helmet());
  48. //配置 sass
  49. // app.use(sass({
  50. // src: __dirname + '/static/sass',
  51. // dest: __dirname + '/static/css',
  52. // indentedSyntax: true,
  53. // sourceMap: true
  54. // }));
  55. //静态文件访问路径
  56. app.use('/static/', express.static(path.join(__dirname, 'static')));
  57. var i = 0;
  58. var prevTime = +new Date();
  59. //每隔3分钟自动请求一次
  60. var t = setInterval(function() {
  61. var nowTime = +new Date();
  62. if (nowTime - prevTime < 3 * 60 * 1000) {
  63. //
  64. } else {
  65. request.get('https://bird.ioliu.cn/joke?_detect=' + i++).end(function(err, response) {
  66. prevTime = +new Date();
  67. });
  68. }
  69. }, 3 * 60 * 1000);
  70. /***
  71. * 全局过滤:统计和日志
  72. */
  73. app.use(function(req, res, next) {
  74. res.header("Access-Control-Allow-Origin", "*");
  75. res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Access-Control-Allow-Origin");
  76. res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  77. var protocol = req.protocol;
  78. var host = req.hostname;
  79. var ip = req.headers['x-real-ip'] ? req.headers['x-real-ip'] : req.ip.replace(/::ffff:/, '');
  80. var ref = req.headers.referer;
  81. var originalUrl = req.originalUrl;
  82. var logs = {
  83. IP: ip,
  84. Host: host,
  85. Referer: ref,
  86. //Protocol: protocol,
  87. OriginalUrl: originalUrl,
  88. Time: new Date().toLocaleString()
  89. };
  90. /**
  91. * 不记录日志和统计的请求:
  92. * _detect 是 VeryCloud 探测机器人
  93. * *.css
  94. * favicon.ico
  95. * robots.txt
  96. * 图片文件
  97. * (JS文件可能有特殊统计需求,需要单独判断)
  98. */
  99. var filter = /_detect|\.css|favicon\.ico|robots\.txt|\.png|\.jpg|\.gif/i.test(originalUrl);
  100. if (!filter) {
  101. /**
  102. * console.log(req.query):
  103. * {
  104. * url: 'http://www.bing.com/HPImageArchive.aspx?format=js',
  105. * idx: '16',
  106. * n: '1'
  107. * }
  108. */
  109. //暂时屏蔽掉*.js日志的记录
  110. if (originalUrl.indexOf('.js') === -1) {
  111. //如果存在引用网址,则打印日志
  112. //if(!!logs['Referer'])
  113. logUtils.print(logs);
  114. }
  115. }
  116. next();
  117. });
  118. app.use('/', welcome);
  119. app.use('/test', test);
  120. app.use('/ip', ip);
  121. app.use('/v1', v1);
  122. app.use('/netease', netease);
  123. app.use('/joke', joke);
  124. app.use('/mobile', mobile);
  125. app.use('/weather', weather);
  126. // catch 404 and forward to error handler
  127. app.use(function(req, res, next) {
  128. var err = new Error('Not Found');
  129. err.status = 404;
  130. next(err);
  131. });
  132. // error handlers
  133. // development error handler
  134. // will print stacktrace
  135. if (app.get('env') === 'development') {
  136. app.use(function(err, req, res, next) {
  137. res.status(err.status || 500);
  138. res.send({
  139. data: {},
  140. status: {
  141. code: err.status,
  142. message: err.message
  143. }
  144. });
  145. });
  146. }
  147. // production error handler
  148. // no stacktraces leaked to user
  149. app.use(function(err, req, res, next) {
  150. res.status(err.status || 500);
  151. res.send({
  152. data: {},
  153. status: {
  154. code: err.status,
  155. message: err.message
  156. }
  157. });
  158. });
  159. module.exports = app;