import express from 'express'
import bodyParser from 'body-parser'
import api from 'routes'
import timeout from 'connect-timeout'
import haltOnTimeout from 'middlewares/haltOnTimeout'
import compression from 'compression'
import helmet from 'helmet'
import path from 'path'

const app = express()

app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: false }))
app.use(timeout(3000))
app.use(haltOnTimeout)

app.use(compression()) // production
app.use(helmet()) // production

app.use('/api', api)

app.use(express.static(path.resolve(`${__dirname}/../../client/build`))) // production

export default app

У меня есть app.js такой.

Теперь я собираюсь развернуть свое приложение на AWS.

Чтобы сделать это,

Я хочу разделить свое промежуточное программное обеспечение на массив и выполнить его в зависимости от среды.

Например,

const middlewares = [
  bodyParser.json(),
  bodyParser.urlencoded({ extended: false }),
  timeout(3000),
  ...
]

const productionMiddlewares = [
  compression(),
  helmet()
  ...
]

Любой обходной путь для этого?

0
Gompro 3 Мар 2018 в 12:59

3 ответа

Лучший ответ

Мой ответ основан на sailsjs

У вас может быть два конфигурационных файла и такая структура

root
  |-app.js
  |-package.json
  |-bootstrapper.js
  |-config
     |- middleware.js

По сути, вы напишите свое промежуточное программное обеспечение, разделенное на среду, в файл middleware.js, файл bootstrapper.js будет содержать логику монтирования промежуточного программного обеспечения в приложение Express, загрузчик может использовать NODE_ENV для выбора промежуточного программного обеспечения, установленного для монтирования. Загрузчик будет вызываться вашим app.js во время запуска.


//app.js
import express from 'express'
import bodyParser from 'body-parser'
import api from 'routes' 
import timeout from 'connect-timeout'
import haltOnTimeout from 'middlewares/haltOnTimeout'
import compression from 'compression'
import helmet from 'helmet'
import path from 'path'
import bootstrapper from 'bootstrap'

const app = express()

bootstrap.bootMiddleware(app)

app.use('/api', api)
app.use(express.static(path.resolve(`${__dirname}/../../client/build`))) // production

export default app

В вашем файле middleware.js вы определяете промежуточное ПО и порядок, в котором вы должны их монтировать, у вас будет другой файл в зависимости от вашей среды.

// */middleware.js
exports.module = {
   'dev_middlewares' : [
      'bodypParserJson',
       // other middlewares
      'helmet'
   ],
   'prod_middlewares' : [
      'bodypParserJson',
       // other middlewares
      'helmet'
   ],
   'helmet' : helmet(),
   'bodypParserJson': bodyParser.json()
}

Тогда загрузчик будет иметь функцию монтирования соответствующего промежуточного программного обеспечения.

// bootstrapper
function loadMiddleware(app, list, middlewareConf){
  _.foreach(middlewareName => {
     app.use(middlewareConf[middlewareName])
  })
}

function bootMiddleware(app){
   let env = process.env.NODE_ENV || 'dev';
   var middlewareConf = require('./config/middleware')
   if(env==='dev') {
      loadMiddleware(app, dev_middleware, middlewareConf)
   } else {
      loadMiddleware(app, prod_middleware, middlewareConf)
   }
}
export bootMiddleware
0
Simone Pontiggia 3 Мар 2018 в 10:49

Стандартный способ

app.configure('development', function() {
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function() {
  app.use(express.errorHandler()); 
});

Простой способ

var middlewares= process.env.NODE_ENV == 'production' ? [compression, ...] : [some-other];
middlewares.forEach((middleware) => app.use(middleware));
1
Aikon Mogwai 3 Мар 2018 в 10:21

Вы можете пройти через необходимый массив и зарегистрировать промежуточное программное обеспечение. Например:

for (var m in (app.get('env') === 'production' ? productionMiddlewares : middlewares)) {
    app.use(m)
}
0
stdob-- 3 Мар 2018 в 10:21