2015-11-16 2 views
3

Таким образом, следующий код работает в разработке и не работает при работе в рабочей среде с ошибкой TypeError: Router.use() requires middleware function but got a Object. Я, должно быть, уже пробовал это примерно сотню разных способов с тем же результатом. Работает в dev, а не в prod.Эксплуатационная маршрутизация с ES6-классами

/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 является transpiled и приложение является запустить в производство. Заранее благодарим за любые мысли по этому поводу.

обновление

Ошибка генерируется на линии 458 /node_modules/express/lib/router/index.js. Это то, что передается в Router.use():

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

Вот версии зависимостей, я думаю, имеют отношение к ошибке (то же самое в прод как в 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" 
} 
+0

Почему ваш конструктор принимает аргумент 'app' (который вы не передаете), а затем функция initialize также принимает аргумент' app', а не использует переменную экземпляра? Выберите один или другой и используйте его последовательно. В лучшем случае это запутанный дизайн. В худшем случае сделать ошибки программирования легко. – jfriend00

+0

Один очевидный вопрос - описать все версии всего, что установлено как в dev, так и в производстве. Было бы также полезно увидеть, в какой строке кода произошла ваша ошибка, и посмотреть, что именно передается в 'Router.use()'. – jfriend00

+0

Короткий ответ на ваш вопрос: «Потому что я просто стреляю слепо в этот момент». Я получу эту информацию для вас и немного обновлю свой вопрос. – MyCompassSpins

ответ

4

Это произошло потому, что изменилось поведение экспорта по умолчанию в 6.0.

Теперь, если вы хотите, чтобы получить экспорт по умолчанию, вы должны беспрекословно делать это:

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

Вы можете увидеть ответ на вопрос о мотивации этого изменения в another question

Кроме того, держать все babel-* пакеты на такая же основная версия. 6.0 пресетов не будет работать с 5.8 babel-core.

+0

Простите, мне потребовалось некоторое время, чтобы ответить. Я возился с получением версий в порядке. Проблема не в моем классе «AppRoutes», а в модуле маршрутов для конечной точки/mail. Мне не удалось экспортировать функцию, если я фактически не назвал функцию и не использовал 'module.exports' для ее экспорта. Я думаю, что не понимаю что-то принципиальное в экспорте es6 и Express Routing. – MyCompassSpins

+0

Бабель изменил отношение 'module.exports' с 6-й версии. Посмотрите на соответствующий вопрос о деталях и решениях: http://stackoverflow.com/questions/33505992/babel-6-changes-how-it-exports-default –

+0

Вы правы, конечно. Не знаю, почему я не понял этого при первом чтении. Благодарю. – MyCompassSpins

Смежные вопросы