2016-08-30 5 views
3

Мое усилие состоит в том, чтобы перестроить мое приложение из Express в Koa, поэтому routes.js и controllers.js работают ранее. Я пытаюсь создать небольшой механизм для создания шаблона в Koa. Цель состоит в том, чтобы применить рабочий код для других модулей, загружая различные двигатели шаблонов автоматически через переменную визуализации, вызывающую module.view_engine per module.routes. Вы можете помочь?Как сделать шаблон с Koa

+---modules 
| +---core 
| | +---client 
| | | \---views 
| | |   equipment.pug 
| | |   error.pug 
| | |   home.pug 
| | |   
| | \---server 
| |  +---configs 
| |  |  core.config.json 
| |  |  core.koa.configs.js 
| |  |  
| |  +---controllers 
| |  |  core.server.controllers.js 
| |  |  
| |  +---models 
| |  |  assembly.server.model.js 
| |  |  ecms_equipment.server.model.js 
| |  |  ecms_location.server.model.js 
| |  |  ecms_main.server.model.js 
| |  |  index.js 
| |  |  
| |  \---routes 
| |    core.server.routes.js 
| |    
| +---assemblys 
| | +---client 
| | | \---views 
| | |   assembly_view.pug 
| | |   
| | \---server 
| |  +---controllers 
| |  |  assemblys.server.controllers.js 
| |  |  
| |  \---routes 
| |    assemblys.server.routes.js 

Это моя структура каталогов. С парой Lodash каждый петли, я могу достичь view_path, маршруты, view_engine для каждого модуля в core.koa.configs.js

modules[module] = { 
    view_path: view_path, 
    routes: routes, 
    view_engine: view_engine 
    }; 

В том же файле, с module еще внутри цикла _.each, звоню

// regex to narrow the scope of code experimenting 
if (module.re('assemblys')) { 
    // === var render here? === 
    require(routes)(app); 
    } 

Это занимает приложение к assembly.server.routes.js, содержащих следующие:

var controller = require('../controllers/projects.server.controllers'); 


module.exports = function(app){ 
    app.get('/task', controller.assembly) 
}; 

Затем в assembly.server.controllers.js, Я стараюсь, чтобы обеспечить функцию сборки, но он не работает - 404:

// load Sequelize models 
var models = require(process.cwd() + '/modules/core/server/models'); 

exports.assembly = function *() { 
    var that = this.body, views = require('co-views'); 
    var render = views('../../client/views/' , { 
    map: {pug: 'jade'} 
    }); 
    var Assembly = models.Assembly; 

    Assembly.findAll().then(function (assemblys) { 
    that = yield render('assembly_view' , {assemblys: assemblys}); 
    }); 
}; 

Раньше я положил var render внутри core.configs, чтобы иметь возможность использовать view_path прямо там, но потом, когда я прохожу render в function *(), У меня ошибка и ошибка приложения! Когда рендер был в core.configs, я имел routes.js файл экспортирующей это:

module.exports = function(app, render){ 
     app.get('/task', controller.assembly(render)); 
    }; 

Некоторые примеры Коа говорит, используя route в этом app.use(route.get('/assembly', function *() { }); , и я видел некоторые другие примеры просто использовать этот

app.get('/task', controller.assembly(render)); // cnpmjs.org, koan stack... 

Я предпочитаю последний. Но имея проблемы с yield render и как загрузить приложение, визуализировать параметры в генераторе function *(app,render), я попробовал это, но он тоже не работает. Ошибка в трассировке стека.

Идея результат иметь в core.koa.configs.js:

if (module.re('assemblys')) { 
    var render = views(view_path , { 
     map: view_engine 
    }); 
    require(routes)(app, render); 
} 

затем экспортных маршрутов

module.exports = function(app, render){ 
    app.get('/task', controller.assembly(render)) 
}; 

и контроллер способен оказывать assemblys:

exports.assembly = function *(render) { 
    var that = this.body, views = require('co-views'); 
    var Assembly = models.Assembly; 

    Assembly.findAll().then(function (assemblys) { 
    that = yield render('assembly_view' , {assemblys: assemblys}); 
    }); 
}; 

Обновление: см. stack-traces, см. koa branch_commit. -compiled.js.map были созданы ES6-Babel

+0

Есть ли у вас какие-либо лога от консоли о 404 вы получаете? Не удивите меня, если он работает так, как ожидалось, но 404 исходит из вашего файла Pug. – doublesidedstickytape

+0

Благодарим вас за ввод. http://imgur.com/a/A79vG Обновление со стековыми следами. Я использую сервис co-views, вам нужны мои пакеты.json? –

ответ

0

Koa (в отличие от express) не ждет, пока вы не установите тело ответа. Если функция промежуточного программного обеспечения завершилась, и тело ответа пуст, оно даст ответ 404. Вот почему в koa вам следует избегать обратных вызовов или обещать их.

Вот как ваша функция промежуточного слоя должна выглядеть в коа стиле:

exports.assembly = function *(render) { 
    var that = this.body, views = require('co-views'); 
    var Assembly = models.Assembly; 

    var assemblys = yield Assembly.findAll(); 
    that = yield render('assembly_view' , {assemblys: assemblys}); 
};