react-project icon indicating copy to clipboard operation
react-project copied to clipboard

Add express middleware hooks

Open jaredpalmer opened this issue 9 years ago • 9 comments

This would allow some optional server customization, but still keep everything 'battery-pack included'

// PublicServerAPI.js
export function createServer({ renderDocument, renderApp, routes, devMiddlewares, prodMiddlewares }) {
  const server = express()
  const webpackStats = getWebpackStats()

  if (process.env.NODE_ENV === 'production') {
    server.use(compression())
    prodMiddlewares(server)
    server.use(express.static(PUBLIC_DIR))
  } else {
    devMiddlewares(server)
  }
...
// Example middleware hooks (psuedo code)
// modules/server.js
...
import { createServer } from 'react-project/server'
..
import morgan from 'morgan'
import newrelic from 'newrelic'
...

function devMiddlewares(server) {
  server.use(morgan('dev'))
}

function prodMiddlewares(server) {
  server.use(morgan('combined'))
  server.locals.newrelic = newrelic
}

createServer({
  renderDocument,
  renderApp,
  routes,
  devMiddlewares,
  prodMiddlewares
}).start()
...

jaredpalmer avatar Feb 24 '16 17:02 jaredpalmer

This is interesting, but is there anything wrong with:

// Example middleware hooks (psuedo code)
// modules/server.js
...
import { createServer } from 'react-project/server'
..
import morgan from 'morgan'
import newrelic from 'newrelic'
...

const server = createServer({
  renderDocument,
  renderApp,
  routes
})

if (process.env.NODE_ENV === 'development') {
  server.use(morgan('dev'))
}

if (process.env.NODE_ENV === 'production') {
  server.use(morgan('combined'))
  server.locals.newrelic = newrelic
}

server.start()

I'm a little hesitant to become a wrapper over express.

ryanflorence avatar Feb 25 '16 16:02 ryanflorence

@ryanflorence middleware needs to be defined before the routes are defined.

jakedahm avatar Feb 25 '16 22:02 jakedahm

@ryanflorence 100% agree, but if we don't want to wrap express, then maybe we should do the following:

  1. Move all the great default express-specific middleware to the server.js blueprint file
  2. Keep the awesome rendering functions you wrote in the react-project server api

jaredpalmer avatar Feb 25 '16 23:02 jaredpalmer

^ how about that?

ryanflorence avatar Feb 26 '16 00:02 ryanflorence

LGTM

jaredpalmer avatar Feb 26 '16 00:02 jaredpalmer

I actually want to just put morgan in by default

ryanflorence avatar Feb 26 '16 02:02 ryanflorence

Pretty sure this is now solved with the createServer API.

// server.js
...

import morgan from 'morgan'

...

const server = createServer(getApp)
process.env.NODE_ENV !== 'production' ? server.use(morgan('dev')) : server.use(morgan('combined'))
server.start()

jaredpalmer avatar Mar 07 '16 02:03 jaredpalmer

I'm leaving this open because I am interested in having nicer hooks around things as we learn what is commonly added/replaced/removed.

ryanflorence avatar Mar 07 '16 20:03 ryanflorence

fair enough.

jaredpalmer avatar Mar 08 '16 05:03 jaredpalmer