【发布时间】: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.js:export default router(router是express.Router())。你的建议把我带到了那里,所以如果你想发布它,我很乐意接受它作为答案。另外,我很想知道我是如何无法理解 ES6 导出的 :)
标签: node.js express ecmascript-6