将Express应用迁移到NestJS

11

我有一个已经存在的Express应用程序,它非常大。我想逐步将其迁移到NestJS应用程序上。因此,我已经创建了一个包含现有Express实例的Nest应用程序,但我遇到了一个问题-所有的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();

在根路径上,我期望看到 Hello World! ,但是我看到了 Auth middleware

我知道我可以做类似这样的事情

expressApp.get('/test', authMiddleware, ((req, res) => res.end('Test')))

但是当前项目太大了,有子路由和不止一个中间件。也许有另一种正确的方法来做到这一点?


可能是因为在这个例子中,你的中间件调用了“.end()”,从而停止了请求。Express 中间件需要执行它的逻辑,然后调用“next()”才能让请求继续到路由。 - nerdy beast
这是一个例子。我不希望中间件被调用。 - Yaroslav Nekryach
不太清楚你想要实现什么。如果你不想调用全局注册的中间件,就不要使用 res.end(),而是使用 next(),但我认为你通常需要重新构建你的应用程序。不确定这是否是你要寻找的,但请查看 NestJS 文档中关于 Guards 的部分?否则,请澄清你想要实现什么。 - Mathias Maerker
1个回答

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)

在上面的代码中,authMiddleware总是在loggingMiddleware之前执行,因为它先附加。例如,如果我们颠倒顺序并首先附加loggingMiddleware,则req.user将始终未定义。 Express文档非常描述了中间件控制流如何操作,并且NestJS在幕后遵循相同的模式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接