【问题标题】:Express Routing with ES6 Classes使用 ES6 类的快速路由
【发布时间】:2016-02-17 01:37:52
【问题描述】:

因此,以下代码在开发环境中有效,在生产环境中运行时失败,错误为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;

再次,在开发中工作,在 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 中与在 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"
}

【问题讨论】:

  • 为什么你的构造函数需要一个app参数(你没有通过)然后初始化函数也需要一个app参数而不是使用实例变量?选择其中一个并始终如一地使用它。充其量,这是令人困惑的设计。在最坏的情况下,这样很容易犯编程错误。
  • 一个明显的问题是描述在开发和生产中安装的所有内容的所有版本。准确查看您的错误发生在哪一行代码并查看传递给Router.use() 的确切内容也很有用。
  • 对您的问题的简短回答是“因为我此时只是盲目地拍摄”。我会为您获取该信息并稍后更新我的问题。
  • 哈。我找到了罪魁祸首。它位于不在控制台调用堆栈中的路由文件中。此行来自/server/api/mail/index.jsexport default routerrouterexpress.Router())。你的建议把我带到了那里,所以如果你想发布它,我很乐意接受它作为答案。另外,我很想知道我是如何无法理解 ES6 导出的 :)

标签: node.js express ecmascript-6


【解决方案1】:

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

现在如果你想获得默认导出,你应该隐式地这样做:

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

您可以在another question看到有关此更改动机的答案

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

【讨论】:

  • 抱歉,我花了一段时间才回复。我一直在搞乱按顺序获取版本。问题不在于我的 AppRoutes 类,而在于 /mail 端点的路由模块。除非我实际命名一个函数并使用module.exports 来导出它,否则我无法导出函数。我想我无法理解 es6 导出和 Express 路由的基本知识。
  • Babel 从第 6 版开始改变了module.exports 的态度。详情及解决方法看相关问题:stackoverflow.com/questions/33505992/…
  • 你是对的,当然。不知道为什么我在第一次阅读时没有掌握这一点。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-09-27
  • 2020-11-13
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 2015-11-11
  • 2017-04-04
  • 2017-02-26
相关资源
最近更新 更多