app.js 2.9 KB
Newer Older
B
binaryify 已提交
1 2 3 4 5 6
const express = require('express')
const apicache = require('apicache')
const path = require('path')
const fs = require('fs')
const app = express()
let cache = apicache.middleware
J
jjeejj 已提交
7 8
const { exec } = require('child_process');
exec('npm info NeteaseCloudMusicApi version', (err, stdout, stderr) => {
B
binaryify 已提交
9
  if (err) {
J
jjeejj 已提交
10 11
    console.error(err);
    return;
B
binaryify 已提交
12
  }
J
jjeejj 已提交
13
  const onlinePackageVersion = stdout.trim();
B
binaryify 已提交
14
  const package = require('./package.json')
J
jjeejj 已提交
15
  if (package.version < onlinePackageVersion) {
B
binaryify 已提交
16 17
    console.log(
      '最新版:Version:' +
J
jjeejj 已提交
18
      onlinePackageVersion +
B
binaryify 已提交
19 20 21 22 23 24
        ',当前版本:' +
        package.version +
        ',请及时更新'
    )
  }
})
J
jjeejj 已提交
25

26
// 跨域设置
B
binaryify 已提交
27 28 29
app.all('*', function(req, res, next) {
  if (req.path !== '/' && !req.path.includes('.')) {
    res.header('Access-Control-Allow-Credentials', true)
B
improve  
binaryify 已提交
30
    // 这里获取 origin 请求头 而不是用 *
B
binaryify 已提交
31 32 33 34
    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')
B
improve  
binaryify 已提交
35
  }
B
binaryify 已提交
36 37
  next()
})
B
improve  
binaryify 已提交
38

B
binaryify 已提交
39
const onlyStatus200 = (req, res) => res.statusCode === 200
40

B
binaryify 已提交
41
app.use(cache('2 minutes', onlyStatus200))
B
binaryify 已提交
42

B
binaryify 已提交
43
app.use(express.static(path.resolve(__dirname, 'public')))
44

孟政元 已提交
45
app.use(function(req, res, next) {
B
binaryify 已提交
46
  const proxy = req.query.proxy
孟政元 已提交
47
  if (proxy) {
B
binaryify 已提交
48
    req.headers.cookie = req.headers.cookie + `__proxy__${proxy}`
孟政元 已提交
49
  }
B
binaryify 已提交
50 51
  next()
})
孟政元 已提交
52

53 54 55
// 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理
const UnusualRouteFileMap = {
  // key 为文件名, value 为对外注册的路由
B
binaryify 已提交
56 57 58 59
  'daily_signin.js': '/daily_signin',
  'fm_trash.js': '/fm_trash',
  'personal_fm.js': '/personal_fm'
}
60

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

65
// 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由
B
binaryify 已提交
66 67 68 69 70 71
fs.readdirSync(path.resolve(__dirname, 'router'))
  .reverse()
  .forEach(file => {
    if (/\.js$/i.test(file) === false) {
      return
    }
72

B
binaryify 已提交
73
    let route
74

B
binaryify 已提交
75 76 77 78 79 80 81 82 83 84 85 86
    if (typeof UnusualRouteFileMap[file] !== 'undefined') {
      route = UnusualRouteFileMap[file]
    } else {
      route =
        '/' +
        file
          .replace(/\.js$/i, '')
          .replace(/_/g, '/')
          .replace(/[A-Z]/g, a => {
            return '/' + a.toLowerCase()
          })
    }
87

B
binaryify 已提交
88 89
    app.use(route, Wrap(require('./router/' + file)))
  })
90

B
binaryify 已提交
91
const port = process.env.PORT || 3000
92 93

app.listen(port, () => {
B
binaryify 已提交
94 95
  console.log(`server running @ http://localhost:${port}`)
})
96

B
binaryify 已提交
97
module.exports = app