app.js 4.1 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) {
48
    req.headers.cookie += `__proxy__${proxy}`
孟政元 已提交
49
  }
B
binaryify 已提交
50 51
  next()
})
孟政元 已提交
52

53 54 55 56 57 58 59 60 61
// 补全缺失的cookie
const { completeCookie } = require('./util/init')
app.use(function(req, res, next) {
  let cookie = completeCookie(req.headers.cookie)
  req.headers.cookie = cookie.map(x => x[0]).concat(req.headers.cookie || []).join('; ')
  res.append('Set-Cookie', cookie.map(x => (x.concat('Path=/').join('; '))))
  next()
})

62 63 64
// 因为这几个文件对外所注册的路由 和 其他文件对外注册的路由规则不一样, 所以专门写个MAP对这些文件做特殊处理
const UnusualRouteFileMap = {
  // key 为文件名, value 为对外注册的路由
B
binaryify 已提交
65 66 67 68
  'daily_signin.js': '/daily_signin',
  'fm_trash.js': '/fm_trash',
  'personal_fm.js': '/personal_fm'
}
69

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

74
// 同步读取 router 目录中的js文件, 根据命名规则, 自动注册路由
B
binaryify 已提交
75 76 77 78 79 80
fs.readdirSync(path.resolve(__dirname, 'router'))
  .reverse()
  .forEach(file => {
    if (/\.js$/i.test(file) === false) {
      return
    }
81

B
binaryify 已提交
82
    let route
83

B
binaryify 已提交
84 85 86 87 88 89 90 91 92
    if (typeof UnusualRouteFileMap[file] !== 'undefined') {
      route = UnusualRouteFileMap[file]
    } else {
      route =
        '/' +
        file
          .replace(/\.js$/i, '')
          .replace(/_/g, '/')
    }
93

B
binaryify 已提交
94 95
    app.use(route, Wrap(require('./router/' + file)))
  })
96

N
Nzix 已提交
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
  const requestMod = require('./util/request')
  let dev = express()
  fs.readdirSync(path.resolve(__dirname, 'module'))
  .reverse()
  .forEach(file => {
    if (/\.js$/i.test(file) === false) {
      return
    }

    let route

    if (typeof UnusualRouteFileMap[file] !== 'undefined') {
      route = UnusualRouteFileMap[file]
    } else {
      route =
        '/' +
        file
          .replace(/\.js$/i, '')
          .replace(/_/g, '/')
    }

    dev.use(route, (req, res) => {
      let question = require('./module/' + file)
      let query = {...req.query, cookie: req.headers.cookie}
      question(query, requestMod)
      .then(answer => {
        console.log('[OK]', req.originalUrl)
        res.append('Set-Cookie', answer.cookie)
        res.status(answer.code).send(answer.body)
      })
      .catch( answer => {
        console.log('[ERROR]', req.originalUrl)
        res.append('Set-Cookie', answer.cookie)
        res.status(answer.code).send(answer.body)
      })
    })
  })
  app.use('/dev', dev)

B
binaryify 已提交
136
const port = process.env.PORT || 3000
137

N
Nzix 已提交
138
app.server = app.listen(port, () => {
B
binaryify 已提交
139 140
  console.log(`server running @ http://localhost:${port}`)
})
141

B
binaryify 已提交
142
module.exports = app