使用ES6的import和export关键字以及Babel来导入/导出Express路由器

21

我有一个旧的测试项目,最初是使用Express 2.X构建的。我正在将其迁移到Express 4.x,并尝试插入Babel 6.x以实验ES6服务器端功能。

更新到Express 4.x还好。原来的应用程序可以正常工作。问题是当我开始添加ES6功能时会出现问题。

特别是,我想用ES6 import {...} from...export {...}替换所有的requiremodule.export指令。

问题:我似乎无法将外部文件中的路由导入主要的app.js文件。

我的app.js这样加载路由:

import { indexRoute } from './routes/index_route';
app.use('/', indexRoute);

index_route.js 中,我有如下代码:

"use strict";
import express from 'express';
var router = express.Router();

router.get('/', function(req, res, next) {
  res.render('index_view', { title: 'Express' });
});

export { router }

这段源代码对于Babel是可以的,但node在启动时报错:

Router.use() requires middleware function but got a undefined

我有两个文件,像 index_route.js 这样,每个文件用于一组路由,据我所知,它们都导入、修改并导出同一个路由对象。无论如何,使用 ES6 关键字进行的导出+导入会返回 undefined

我做错了什么?我在错误的对象上使用了 ES6 关键字吗?我在 app.js 中使用了过时的指令来配置路由吗?


1
你的导入和导出名称不匹配。尝试使用 import { router } from './routes/index_route'; - Achrome
3个回答

25

问题在于您将router作为具名导出项router进行导出,但却试图将其作为indexRoute进行导入。

您应该将导出项重新命名:

export { router as indexRoute }

或更改您的导入:

import { router as indexRoute } from './routes/index_route';

6

试试这个:

export default router;

1
在我看来,这里最好的解决方案是这样做:
export default router

但是你需要
import indexRouter from './routes/index_route'

这主要是因为你很可能从一个路由文件中导出超过一个路由器的情况是不太可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接