app.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. const http = require('http')
  2. const express = require('express')
  3. const morgan = require('morgan')
  4. const bodyParser = require('body-parser')
  5. const chalk = require('chalk')
  6. const config = require('../config')
  7. const expressWs = require('express-ws')
  8. const yargs = require('yargs')
  9. const mode = yargs.argv.mode || 'development'
  10. const app = express()
  11. app.server = http.createServer(app)
  12. expressWs(app, app.server)
  13. if (mode === 'development') {
  14. const webpack = require('webpack')
  15. const webpackDevMiddleware = require('webpack-dev-middleware')
  16. const webpackHotMiddleware = require('webpack-hot-middleware')
  17. const webpackConfig = require('../webpack.config')
  18. const compiler = webpack(webpackConfig)
  19. const devMiddleware = webpackDevMiddleware(compiler, {
  20. noInfo: false,
  21. publicPath: ''
  22. })
  23. app.use((req, res, next) => {
  24. res.set('X-Accel-Buffering', 'no')
  25. next()
  26. })
  27. app.use(devMiddleware)
  28. app.use('/', devMiddleware)
  29. const hotMiddleware = webpackHotMiddleware(compiler, {
  30. path: '/__webpack__/__webpack_hmr'
  31. })
  32. app.use(hotMiddleware)
  33. }
  34. app.use(morgan('combined'))
  35. app.use(bodyParser.json())
  36. app.use(express.static('dist'))
  37. app.listen = (port = config.port || (app.settings.env === 'production' ? 80 : 3000)) => new Promise((resolve, reject) => {
  38. app.server.once('error', (err) => {
  39. if (err.message.includes('EADDRINUSE') && app.settings.env === 'development' && port < 3999) {
  40. console.warn(err.message)
  41. resolve(app.listen(port + 1))
  42. } else {
  43. reject(err)
  44. }
  45. })
  46. app.server.listen(port, () => {
  47. const host = [process.env.HOSTNAME || process.env.COMPUTERNAME || 'localhost', process.env.USERDNSDOMAIN].filter(x => x).join('.').toLowerCase()
  48. const url = `http://${host}:${app.server.address().port}`
  49. console.log(`Server running at ${chalk.underline(chalk.blueBright(url))}`)
  50. })
  51. })
  52. const userApp = express.Router()
  53. // Handle unhandled rejection in route handlers:
  54. const appProxy = new Proxy(userApp, {
  55. get: (_, prop) => {
  56. if (prop[0] == '_') return userApp[prop]
  57. const orig = userApp[prop]
  58. if (orig instanceof Function) {
  59. return (...args) => {
  60. const newArgs = args.map(fn => {
  61. if (fn instanceof Function) {
  62. return Object.assign((...args) => {
  63. const ret = fn(...args)
  64. if (ret && ret.catch) {
  65. ret.catch(err => {
  66. const url = args[0] && args[0].url
  67. console.warn(chalk.yellow(`Unhandled Promise Rejection (${url}): ${err}`))
  68. try {
  69. args[1].status(500).send(err.toString())
  70. } catch (err) {
  71. console.warn(chalk.yellow(`Unable to send error response`))
  72. }
  73. })
  74. }
  75. return ret
  76. }, fn)
  77. } else {
  78. return fn
  79. }
  80. })
  81. return userApp[prop](...newArgs)
  82. }
  83. } else {
  84. return orig
  85. }
  86. }
  87. })
  88. appProxy.start = () => {
  89. app.listen().catch(err => {
  90. console.log(chalk.red(err))
  91. process.exit(1)
  92. })
  93. }
  94. app.use(userApp)
  95. userApp._userApp = userApp
  96. userApp._app = app
  97. module.exports = {
  98. app: appProxy
  99. }
  100. module.exports = app