Node.js 使用ES6类进行快速路由

Node.js 使用ES6类进行快速路由,node.js,express,ecmascript-6,Node.js,Express,Ecmascript 6,因此,以下代码在开发中工作,在生产环境中运行时失败,错误为TypeError:Router.use()需要中间件函数,但得到了一个对象。到现在为止,我一定已经尝试了大约一百种不同的方法,都得到了相同的结果。在dev中工作,而不是在prod中 /server/routes.js 'use strict'; export class AppRoutes { constructor(app) { this.app = app; return func

因此,以下代码在开发中工作,在生产环境中运行时失败,错误为
TypeError:Router.use()需要中间件函数,但得到了一个对象。到现在为止,我一定已经尝试了大约一百种不同的方法,都得到了相同的结果。在dev中工作,而不是在prod中

/server/routes.js

'use strict';

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

        return function initialize(app)
        {
            app.use('/mail', require('./api/mail'));
        }
    }
}
var app = express();
import { AppRoutes } from './routes';
let router = new AppRoutes();
router(app);

// start the server here

// Expose app
export default app;
/server/app.js

'use strict';

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

        return function initialize(app)
        {
            app.use('/mail', require('./api/mail'));
        }
    }
}
var app = express();
import { AppRoutes } from './routes';
let router = new AppRoutes();
router(app);

// start the server here

// Expose app
export default app;
同样,在开发环境中工作,在ES6传输和应用程序在生产环境中运行时会出现故障。提前感谢您对此事的任何想法

更新

该错误在
/node\u modules/express/lib/router/index.js
的第458行抛出。这是传递给
路由器的内容。请使用()

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

节点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"
}

这是因为Babel在6.0中更改了默认的导出行为

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

app.use('/mail', require('./api/mail').default);
你可以看到关于这一变化动机的答案


另外,将所有
babel-*
软件包保持在同一主版本。6.0预设不适用于5.8 babel core。

为什么构造函数采用
app
参数(您没有通过),然后initialize函数也采用
app
参数,而不是使用实例变量?选择其中一个,并始终如一地使用它。充其量,这是一个令人困惑的设计。最坏的情况是,这样很容易犯编程错误。一个明显的问题是描述在开发和生产环境中安装的所有产品的所有版本。查看您的错误发生在哪一行代码上,以及查看传递给
路由器的确切内容也是非常有用的。使用()
。您的问题的简短答案是“因为我只是在这一点上盲目射击”。我会为你获取这些信息,并在稍后更新我的问题。我找到了罪犯。它位于一个路由文件中,该文件不在控制台的调用堆栈中。这一行来自
/server/api/mail/index.js
导出默认路由器
router
express.router()
)。你的建议把我带到了那里,所以如果你想把它贴出来,我很乐意接受。另外,我想知道我是如何无法理解ES6导出的:)很抱歉,我花了一些时间才回复。我一直在忙着整理版本。问题不在my
AppRoutes
类中,而是在/mail端点的routes模块中。我无法导出函数,除非我实际命名函数并使用
module.exports
导出它。我想我没有理解es6导出和快速路由的一些基本知识。自第6版以来,巴贝尔改变了
模块。导出的态度。看看有关细节和解决方案的相关问题:当然,你是对的。我不知道为什么我在第一次阅读时没有领会。谢谢