app.js 2.4 KB
Newer Older
1 2 3
const express = require("express");
const apicache = require("apicache");
const path = require("path");
4
const fs = require("fs");
5 6
const app = express();
let cache = apicache.middleware;
7

8
// 跨域设置
B
improve  
binaryify 已提交
9 10 11 12 13 14 15 16 17 18 19 20
app.all("*", function(req, res, next) {
  if (req.path !== "/" && !req.path.includes(".")) {
    res.header("Access-Control-Allow-Credentials", true);
    // 这里获取 origin 请求头 而不是用 *
    res.header("Access-Control-Allow-Origin", req.headers["origin"] || "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("Content-Type", "application/json;charset=utf-8");
  }
  next();
});

21
const onlyStatus200 = (req, res) => res.statusCode === 200;
22

23
app.use(cache("2 minutes", onlyStatus200));
B
binaryify 已提交
24

25
app.use(express.static(path.resolve(__dirname, "public")));
26

孟政元 已提交
27 28 29 30 31 32 33 34
app.use(function(req, res, next) {
  const proxy = req.query.proxy;
  if (proxy) {
    req.headers.cookie = req.headers.cookie + `__proxy__${proxy}`;
  }
  next();
});

35 36 37 38 39 40 41 42
// 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理
const UnusualRouteFileMap = {
  // key 为文件名, value 为对外注册的路由
  "daily_signin.js": "/daily_signin",
  "fm_trash.js": "/fm_trash",
  "personal_fm.js": "/personal_fm"
};

D
dds_feng 已提交
43 44 45 46
// 简化 路由 导出方式, 由这里统一对 router 目录中导出的路由做包装, 路由实际对应的文件只专注做它该做的事情, 不用重复写样板代码
const { createWebAPIRequest, request } = require("./util/util");
const Wrap = fn => (req, res) => fn(req, res, createWebAPIRequest, request);

47
// 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由
48
fs.readdirSync(path.resolve(__dirname, "router")).reverse().forEach(file => {
49 50 51
  if (/\.js$/i.test(file) === false) {
    return;
  }
52

53 54 55 56 57 58 59 60 61 62 63 64 65 66
  let route;

  if (typeof UnusualRouteFileMap[file] !== "undefined") {
    route = UnusualRouteFileMap[file];
  } else {
    route =
      "/" +
      file
        .replace(/\.js$/i, "")
        .replace(/_/g, "/")
        .replace(/[A-Z]/g, a => {
          return "/" + a.toLowerCase();
        });
  }
67

D
dds_feng 已提交
68
  app.use(route, Wrap(require("./router/" + file)));
69
});
70

71
const port = process.env.PORT || 3000;
72 73

app.listen(port, () => {
孟政元 已提交
74
  console.log(`server running @ http://localhost:${port}`);
75
});
76

77
module.exports = app;