Как правильно использовать промежуточное ПО UseAfter в TSED (Typescript Express Decorators) - PullRequest
1 голос
/ 16 апреля 2019

Я использую TsExpressDecorators - платформа TypeScript поверх Express
Я пытаюсь использовать UseAfter middleware .
Используйте, используйте, прежде чем промежуточное программное обеспечение работает. Но UseAfter не работает.

Я нашел UseAfter описание здесь проблемы / 56

Использовать промежуточное программное обеспечение, добавленное к контроллеру. Они вызываются после конечных точек контроллера, если ничего не отправлено.

и здесь тяга / 105

будет вызываться после конечных точек, если ответ не отправлен

Поэтому я попытался выдать новую ошибку («Описание ошибки») внутри метода контроллера. Нет результата.

Я скопировал инструкции Как отформатировать ответ с промежуточным программным обеспечением . Нет результата.

Мой рабочий код с 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...