如何在TSED(Typescript Express装饰器)中正确使用UseAfter中间件

时间:2019-04-16 12:13:20

标签: node.js typescript express

我使用TsExpressDecorators-Express之上的TypeScript框架
我尝试使用UseAfter middleware
使用,在中间件工作之前使用。但是UseAfter不起作用。

我在这里issues/56

找到了UseAfter描述
  

UseAfter中间件已添加到控制器中。如果未发送任何响应,则在控制器的端点之后调用它们。

此处pull/105

  

如果未发送任何响应,将在端点之后调用

所以我尝试在控制器方法内抛出新的Error('Error description')。没有结果。

我复制了说明how-to-format-the-response-with-middleware。 没有结果。

我在UseBefore上的工作代码:

// initial app.ts
import { ServerLoader, ServerSettings } from '@tsed/common';

@ServerSettings({
  httpPort: '3000',
  httpsPort: false,
  rootDir: path.resolve(__dirname),
  mount: {
    '/rest': `${path.resolve(__dirname)}/controllers/**/*.ts`,
  },
  componentsScan: [
    //...
  ],
})
export default class Server extends ServerLoader {
  public async $onMountingMiddlewares() {
    this.use(bodyParser.json({ limit: '5mb' }))
      .use(bodyParser.urlencoded({ extended: false }))
      .use(
        session({
          proxy: true,
          // secret: ,
          resave: true,
          saveUninitialized: true,
          cookie: {
            httpOnly: false,
            secure: false,
            // maxAge: ...,
          },
          name: 'id...',
        }),
      )
  }
}

new Server().start();
// Method with parameter which returns decorated middleware
export default function myMiddlewareWrapper(isBool: boolean = false) {

  @Middleware()
  class MyMiddlewareWrapper implements IMiddleware {
    public async use(@Next() next: Express.NextFunction) {
      console.log(`It works for Use, UseBefore, but not for UseAfter`);
      return next();
    }
  }

  return MyMiddlewareWrapper;
}
// My decorator
import myMiddlewareWrapper from '@middlewares/MyMiddlewareWrapper';
import { UseAfter, UseBefore } from '@tsed/common';

export function MyDecorator(isBool: boolean = false) {
  return UseBefore(myMiddlewareWrapper(isBool)); // It works
  // return UseAfter(myMiddlewareWrapper(isBool)); // It doesn't work
}
// My controller
@Controller('/data')
export class MyController {

  @Get('/get')
  @MyDecorator()
  public async getData(
    @Res() res: Express.Response,
    @Next() next: Express.NextFunction,
  ) {
    response.send([]); // If I comment send to don't send response, useAfter won't work
  }
}

0 个答案:

没有答案