Я использую 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
}
}