(getApp)
| 29 | import ErrorMessage from './ErrorMessage' |
| 30 | |
| 31 | export function createServer(getApp) { |
| 32 | const server = express() |
| 33 | const webpackStats = getWebpackStats() |
| 34 | server.disable('x-powered-by') |
| 35 | server._listen = server.listen |
| 36 | server.listen = () => { |
| 37 | throw new Error('[react-project]', 'Do not call `server.listen()`, use `server.start()`') |
| 38 | } |
| 39 | |
| 40 | server.start = () => { |
| 41 | addMiddleware(server) |
| 42 | server.all('*', (req, res) => { |
| 43 | getApp(req, res, (err, { render, routes }) => { |
| 44 | if (err) { |
| 45 | onError(err, req, res) |
| 46 | } else { |
| 47 | match({ routes, location: req.url }, (err, redirect, routerProps) => { |
| 48 | if (err) { |
| 49 | onError(err, req, res) |
| 50 | } else if (redirect) { |
| 51 | // TODO: need a way to specify 301, 302, 307 etc. in the route config. |
| 52 | // will need to make changes in React Router or history probably |
| 53 | res.redirect(redirect.pathname + redirect.search) |
| 54 | } else if (routerProps) { |
| 55 | sendWithReactRouter({ req, res, render, webpackStats, routerProps }) |
| 56 | } else { |
| 57 | sendNoRoutesMatched(res) |
| 58 | } |
| 59 | }) |
| 60 | } |
| 61 | }) |
| 62 | }) |
| 63 | |
| 64 | server._listen(PORT, () => { |
| 65 | log() |
| 66 | log(`NODE_ENV=${process.env.NODE_ENV}`) |
| 67 | log(`Express server listening on port`, PORT) |
| 68 | }) |
| 69 | } |
| 70 | |
| 71 | return server |
| 72 | } |
| 73 | |
| 74 | function addMiddleware(server) { |
| 75 | if (process.env.NODE_ENV === 'production') { |
no test coverage detected