使用ES6类快速路由

时间:2015-11-16 01:23:45

标签: node.js express ecmascript-6

因此,以下代码在开发中工作,在生产环境中运行时失败,错误为TypeError: Router.use() requires middleware function but got a Object。到目前为止,我已经尝试了大约一百种不同的方法,结果相同。在开发中工作,而不是在生产中。

/server/routes.js

'use strict';

export class AppRoutes
{
    constructor(app)
    {
        this.app = app;

        return function initialize(app)
        {
            app.use('/mail', require('./api/mail'));
        }
    }
}

/server/app.js

var app = express();
import { AppRoutes } from './routes';
let router = new AppRoutes();
router(app);

// start the server here

// Expose app
export default app;

再次,在dev中工作,在ES6被编译并且应用程序在生产中运行时被破坏。提前感谢您对此事的任何想法。

更新

/node_modules/express/lib/router/index.js的第458行引发错误。这是传递给Router.use()的内容:

{ default: 
   { [Function: router]
     params: {},
     _params: [],
     caseSensitive: undefined,
     mergeParams: undefined,
     strict: undefined,
     stack: [ [Object], [Object] ] 
    } 
}

以下是我认为与错误相关的依赖项的版本(与开发中的prod相同):

节点v0.12.2

来自我的package.json

{
    "express": "^4.13.3",
    "babel-runtime": "^5.8.20",
    "grunt-babel": "^6.0.0"
},
"devDependencies": {
    "babel-core": "^5.8.34",
    "babel-preset-es2015": "^6.1.18",
    "babel-preset-stage-0": "^6.1.18"
}

1 个答案:

答案 0 :(得分:4)

发生这种情况是因为已更改6.0中的默认导出行为。

现在,如果您想获得默认导出,则应隐式执行:

app.use('/mail', require('./api/mail').default);

您可以在MSDN

中查看有关此更改动机的答案

此外,请将所有babel-*个软件包保留在同一个主要版本中。 6.0预设将不适用于5.8 babel-core。