将 Express 应用程序迁移到 NestJS

Yar*_*ach 11 javascript migration node.js express nestjs

我有一个现有的 Express 应用程序,并且它足够大。我想将其迁移到 NestJS 应用程序,但要一步一步地进行。因此,我使用现有的 Express 实例创建了 Nest 应用程序,但遇到了一个问题 - 所有嵌套处理程序总是在 Express 处理程序之后添加。但我有一个根 Express 中间件,我只想应用于它后面的一些处理程序。如何在 Express 处理程序之前应用 Nest 处理程序?

例如。我创建了一个新的 NestJS 项目,并更改了 main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ExpressAdapter } from '@nestjs/platform-express';
import * as express from 'express';

const expressApp = express();
const authMiddleware = (req, res) => res.end('Auth middleware');
expressApp.use(authMiddleware);
expressApp.get('/test', ((req, res) => res.end('Test')))

async function bootstrap() {
  const app = await NestFactory.create(AppModule, new ExpressAdapter(expressApp));

  await app.listen(3000);
}
bootstrap();
Run Code Online (Sandbox Code Playgroud)

在根路径上我希望看​​到Hello World!但我看到Auth 中间件

我明白我可以做类似的事情

expressApp.get('/test', authMiddleware, ((req, res) => res.end('Test')))
Run Code Online (Sandbox Code Playgroud)

但目前的项目太大了,有子路由器,而且不是只有一个中间件。也许还有另一种方法可以做到正确?

小智 1

您的身份验证中间件始终会结束请求,并且行为方式与中间件通常的行为不同。通常中间件有这样的签名......

const authMiddleware = (req, res, next) => {
  // do auth things like verify a JWT and attach it to req.user

  next()
}
expressApp.use(authMiddleware)

const loggingMiddleware = (req, res, next) => {
  const { headers, body, user, route } = req
  console.log({ headers, body, user, route })
  next()
}
expressApp.use(loggingMiddleware)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,authMiddleware 始终在loggingMiddleware 之前执行,因为它是先附加的。比如说,如果我们颠倒顺序并首先附加loggingMiddleware,则req.user将始终是未定义的。Express文档对中间件控制流如何运行进行了非常详细的描述,而 NestJS 在底层也遵循相同的模式。