Экспресс и машинопись: res: Ответ не определен - PullRequest
0 голосов
/ 08 июня 2018

Привет, я использую машинопись для создания узла / экспресс-восстановления API.

Однако я получаю следующую ошибку: Это соответствует строке res.json('hello') в users/user.controller.ts

TypeError: Невозможно прочитать свойство 'json' из неопределенного

users / user.controller.ts

import { Request, Response, NextFunction } from 'express';

    class UserController {

        constructor() {

        }

        public index(req: Request, res: Response): void {

            res.json('hello');

        }

        public show(req: Request, res: Response): void {

        }

        public store(req: Request, res: Response): void {

        }

        public update(req: Request, res: Response): void {

        }

        public destroy(req: Request, res: Response): void {

        }
    }

    export default UserController;

users / user.route.ts

import { Router } from 'express';

import UserController from './user.controller';

class UserRouter {

    router: Router;
    controller: any;

    constructor() {

        this.router = Router();
        this.controller = new UserController;

        this.router.get('/', this.controller.index());
        this.router.get('/:id', this.controller.show());
        this.router.post('/', this.controller.store());
        this.router.put('/:id', this.controller.update());
        this.router.delete('/:id', this.controller.destroy());

    }
}

export default new UserRouter().router;

rout.ts

import { Router } from 'express';
import UserRouter from './app/users/user.router';

class Routes {

    public router: Router;

    constructor() {

        this.router = Router();

        this.router.use('/', (req, res, next) => {
            res.json('App / Server Running');
        })

        this.router.use('/users', UserRouter);

}

export default new Routes().router;

app.ts

import dotenv from 'dotenv';
import express from 'express';
import logger from 'morgan';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';
import passport from 'passport';
import cors from "cors";

import Routes from './routes';
import Config from './config/app';


class App {

    public app: express.Application;
    public config: any;

    constructor() {

        this.app = express();

        this.environment();
        this.database();
        this.middleware();
        this.routes();

    }

    private environment(): void {

        dotenv.load({ path: '.env' });
        this.config = new Config();

    }

    private database(): void {

        const uri: string = this.config.db.uri;
        const options: any = this.config.db.options;

        mongoose.connect(uri, options).then(

            () => {
                console.log("MongoDB Successfully Connected On: " + this.config.db.uri)
            },
            (err: any) => {
                console.error("MongoDB Error:", err);
                console.log('%s MongoDB connection error. Please make sure MongoDB is running.');
                process.exit();
            }

        );

    }

    private middleware(): void {

        this.app.use(cors());
        this.app.use(logger('dev'));
        this.app.use(bodyParser.json());
        this.app.use(bodyParser.urlencoded({ extended: false }));

    }

    private routes(): void {

        this.app.use('/', Routes);

    }

}

export default App;

Пользовательский контроллер инициализируется внутри пользовательских маршрутов, которые используются главным маршрутизатором.

1 Ответ

0 голосов
/ 08 июня 2018

Проблема в том, что вы вызываете методы вашего контроллера, а не передаете их маршрутизатору, заставляя их выполнять с неопределенными аргументами, как только создается UserRouter - см. Эти строки:

this.router.get('/', this.controller.index());
this.router.get('/:id', this.controller.show());
this.router.post('/', this.controller.store());
this.router.put('/:id', this.controller.update());
this.router.delete('/:id', this.controller.destroy());

На самом деле это должно выглядеть так:

this.router.get('/', this.controller.index);
this.router.get('/:id', this.controller.show);
this.router.post('/', this.controller.store);
this.router.put('/:id', this.controller.update);
this.router.delete('/:id', this.controller.destroy);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...