Метод класса ES6 как Express параметр маршрутизатора - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь передать метод класса в качестве параметра маршрута Express, я пытался связать метод без использования функции стрелки, но он тоже не работал.

Я использую TypeORM и ошибка, которую я получаю, заключается в том, что это «Соединение» по умолчанию «не найдено», но если я напишу полную функцию (как показано ниже) в качестве параметра, все будет работать нормально.

router.get("/", async (_req: Request, res: Response) => {
    try {
        const projects: Project[] = await new ProjectService().findAll();

        res.status(200).send(projects);
    } catch (e) {
        res.status(404).send(e.message);
    }
});

Код ниже не работает.

ProjectRoutes.ts

const router: Router = Router();

const projectController = new ProjectController();

router.get("/", projectController.getAllProjects);

export default router;

ProjectController.ts

export class ProjectController {
    projectService: ProjectService = new ProjectService();

    getAllProjects = async (_req: Request, res: Response) => {
        try {
            const projects: Project[] = await this.projectService.findAll();
            return res.status(200).send(projects);
        } catch (e) {
            return res.status(404).send(e.message);
        }
    };
}

ProjectService.ts

export class ProjectService {
    projectRepository: ProjectRepository;

    constructor() {
        this.projectRepository = getCustomRepository(ProjectRepository);
    }

    async findAll(): Promise<Project[]> {
        return await this.projectRepository.findAll();
    }
}

ProjectRepository

@EntityRepository(Project)
export class ProjectRepository extends Repository<Project> {
    async findAll(): Promise<Project[]> {
        return await this.find();
    }
}

Маршруты index.ts

const router: Router = Router();

router.use("/projects", ProjectRoutes);

export default router;

Server.ts

app.use("/", router);

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

@ elderapo указал на проблему. Для решения проблемы можно использовать следующий шаблон.

ProjectController.ts

export class ProjectController {
    projectService: ProjectService = new ProjectService();

    getAllProjects = async (_req: Request, res: Response) => {
        try {
            const projects: Project[] = await this.projectService.findAll();
            return res.status(200).send(projects);
        } catch (e) {
            return res.status(404).send(e.message);
        }
    };
}

rout.ts

import {ProjectController} from './controller/ProjectController'

export const Routes = [{
    method: "get",
    route: "/",
    controller: ProjectController,
    action: "getAllProjects"
}]

index.ts

import {Routes} from "./routes";
...
createConnection().then(async connection => {

    // create express app
    const app = express();
    app.use(bodyParser.json());

    // register express routes from defined application routes
    Routes.forEach(route => {
        (app as any)[route.method](route.route, (req: Request, res: Response, next: Function) => {
            const result = (new (route.controller as any))[route.action](req, res, next);
            if (result instanceof Promise) {
                result.then(result => result !== null && result !== undefined ? res.send(result) : undefined);

            } else if (result !== null && result !== undefined) {
                res.json(result);
            }
        });
    });

    // setup express app here
    // ...

    // start express server
    app.listen(3000);
}).catch(error => console.log(error));

Этот шаблон используется в стартовом проекте, созданном с typeorm init --name NodeStarter --database postgres --express

0 голосов
/ 26 марта 2020

Ошибка Connection "default" was not found., выданная typeorm, обычно означает, что вы пытаетесь создать репозиторий / использовать менеджер / получить соединение до того, как будет установлено соединение с БД.

Разница между обработчиком запроса функции и классом Обработчик методов в вашем случае заключается в том, что в обработчике функций вы как бы лениво инициализируете службу (когда сервер получает запрос) и охотно подходите в своем классе (до регистрации маршрута - на этапе запуска сервера).

const projectController = new ProjectController(); // <--- here you're creating an instance of controller which creates an instance of ProjectService which creates aninstance of ProjectRepository
router.get("/", projectController.getAllProjects);

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

...