Express:我可以在一个 app.use 中使用多个中间件吗?

mik*_*ana 8 javascript node.js express

我有很多充满样板代码的应用程序,看起来像这样:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(require('express-session')({
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
Run Code Online (Sandbox Code Playgroud)

如何一次使用多个中间件?所以我可以把上面的变成:

// Some file, exporting something that can be used by app.use, that runs multiple middlewares
const bodyParsers = require('body-parsers.js')
const sessions= require('sessions.js')

// Load all bodyparsers
app.use(bodyParsers)

// Load cookies and sessions
app.use(sessions)
Run Code Online (Sandbox Code Playgroud)

Sur*_*ati 15

您可以指定多个中间件,请参阅app.use 文档

以上任何一项的组合数组。

您可以创建所有中间件的文件,例如 -

中间件.js

module.exports = [
  function(req, res, next){...},
  function(req, res, next){...},
  function(req, res, next){...},
  .
  .
  .
  function(req, res, next){...},
]
Run Code Online (Sandbox Code Playgroud)

然后简单地添加它:

/*
you can pass any of the below inside app.use()
A middleware function.
A series of middleware functions (separated by commas).
An array of middleware functions.
A combination of all of the above.
*/
app.use(require('./middlewares.js'));
Run Code Online (Sandbox Code Playgroud)

注意 - 仅对所有请求通用的中间件执行此操作

  • 导出数组绝对是比调用“Object.values”的对象更好的解决方案,因为对于数组,中间件的执行顺序是定义的,对于“Object.values”,它可以是任何顺序(它将最有可能在一个节点版本中保持一致,但在不同节点版本之间可能会发生变化) (2认同)

Jak*_*ger 5

我喜欢使用 aRouter来封装应用程序路由。我更喜欢它们而不是路线列表,因为 aRouter就像一个迷你快递应用程序。

您可以body-parsers像这样创建路由器:

const {Router} = require('express');

const router = Router();

router.use(bodyParser.json());
router.use(bodyParser.urlencoded({ extended: false }));
router.use(cookieParser());
router.use(require('express-session')({
        secret: 'keyboard cat',
        resave: false,
        saveUninitialized: false
}));
router.use(passport.initialize());
router.use(passport.session());

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

然后像任何其他路由一样将它附加到您的主应用程序:

const express = require('express');

const app = express();
app.use(require('./body-parsers'));
Run Code Online (Sandbox Code Playgroud)