Javascript 打字稿&;Express:将多条路由从单个index.ts文件导出到前缀为''/api/v1“;

Javascript 打字稿&;Express:将多条路由从单个index.ts文件导出到前缀为''/api/v1“;,javascript,node.js,typescript,express,Javascript,Node.js,Typescript,Express,我正在努力整理我的路线。我想有一个文件index.ts来导出我所有的路由。我在纯JavaScript中看到过类似的操作,但不确定typescript中的语法 The error I get is: TypeError: Router.use() requires a middleware function but got a Object (旧但有效)BaseRoutes.ts import * as express from 'express'; import {PostRoutes} fr

我正在努力整理我的路线。我想有一个文件index.ts来导出我所有的路由。我在纯JavaScript中看到过类似的操作,但不确定typescript中的语法

The error I get is: TypeError: Router.use() requires a middleware function but got a Object
(旧但有效)BaseRoutes.ts

import * as express from 'express';
import {PostRoutes} from '../PostRoutes';
import {CspRoutes} from '../CspRoutes';
import {CustomerPreferenceRoutes} from '../CustomerPreferenceRoutes';
import { SalesOrderRoutes } from '../SalesOrderRoutes';
let app = express();
const BASE_API: string = '/api/v2';
class BaseRoutes{
    get routes(){
        app.use(BASE_API, new PostRoutes().routes);
        app.use(BASE_API, new CspRoutes().routes);
        app.use(BASE_API, new CustomerPreferenceRoutes().routes);
        app.use(BASE_API, new SalesOrderRoutes().routes);
        return app;
    }
}
export {BaseRoutes}
(新建不起作用)BaseRoutes.ts

import * as express from 'express';

let routes = require('../index');
let app = express();
const BASE_API: string = '/api/v2';

class BaseRoutes{
    get routes(){
        app.use(BASE_API,routes);
        return app;
    }
}
export {BaseRoutes}
邮路

import * as express from 'express';
import {PostController} from '../../controllers/PostController'

let router = express.Router();

class PostRoutes{
    private _postController:PostController;
    constructor(){
        this._postController = new PostController();
    }
    get routes(){
        let controller = this._postController
        router.get('/posts',controller.retrieve)
        router.get('/posts/:_id',controller.findById)
        return router;
    }
}
export{PostRoutes};
索引

export * from './PostRoutes';
export * from './SalesOrderRoutes';

那是因为你把你的进口弄糟了

export * from './PostRoutes';
export * from './SalesOrderRoutes';
您正在从
PostRoutes
saleOrderRoutes
等重新导出所有导出,因此当您最终在
BaseRoutes
中导入它时,您实际上导入了在每个路由中导出的所有构造函数

您要做的是:

import { PostRoutes, SalesOrderRoutes } from '../index';
然后显式地使用()每个路由

编辑:您可以阅读有关和的更多信息



这是因为你把你的导入搞砸了

export * from './PostRoutes';
export * from './SalesOrderRoutes';
您正在从
PostRoutes
saleOrderRoutes
等重新导出所有导出,因此当您最终在
BaseRoutes
中导入它时,您实际上导入了在每个路由中导出的所有构造函数

您要做的是:

import { PostRoutes, SalesOrderRoutes } from '../index';
然后显式地使用()每个路由

编辑:您可以阅读有关和的更多信息



这确实可以清理东西。但是,这是一种类似于此应用程序的方法。使用('/api/v1',require('../routes/v1');就像在javascript中一样?是的,但是“../routes/v1”模块需要返回router对象,这样,当导入模块时,您将得到app.use('api/v1',routerImportedFromAnotherModule')。换句话说,模块“../routes/v1”需要默认导出已分配路由的路由器。这会清理问题。但是,这是一种类似于此应用程序的方法。使用('/api/v1',require('../routes/v1');就像在javascript中一样?是的,但是“../routes/v1”模块需要返回router对象,这样,当导入模块时,您将得到app.use('api/v1',routerImportedFromAnotherModule')。换句话说,模块“../routes/v1”需要默认导出已分配路由的路由器。