【问题标题】:Migrating Express application to NestJS将 Express 应用程序迁移到 NestJS
【发布时间】:2020-10-07 13:10:46
【问题描述】:

我有一个现有的 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();

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

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

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

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

【问题讨论】:

  • 您能否包含一些代码以使其更易于理解?
  • 好的,我已经在帖子中添加了一个示例。
  • 这可能是因为您在此示例中的中间件正在调用“.end()”,这将在那里停止请求。 Express 中间件需要执行其逻辑,然后调用“next()”以使请求继续到路由。
  • 这是一个例子。我根本不希望调用中间件。
  • 目前还不清楚你想要实现什么。如果您不想调用全局注册的中间件,请不要使用res.end() 使用next() 但我认为您通常需要重组您的应用程序。不确定这是否是您要查找的内容,但请查看 NestJS 文档中有关 Guards 的部分?否则,请说明您要达到的目标

标签: javascript node.js express migration nestjs


【解决方案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 documentation 非常描述中间件控制流的操作方式,并且 NestJS 在后台遵循相同的模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多