2016-08-30 5 views
3

私の努力は、ExpressからKoaまで私のアプリを再エンジニアリングすることです。それで、routes.jsとcontrollers.jsは以前に動作します。私はKoaでテンプレートをレンダリングするための小さなメカニズムを作成しようとします。目標は他のモジュールに作業コードを適用して、異なるテンプレートエンジンを自動的にレンダリング変数を通して呼び出し、module.view_engineを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のカップルの各ループで、私はmoduleまだ_.eachループ内で、私が呼ぶと、同じファイルで

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

core.koa.configs.js

にモジュールあたりview_path、ルート、view_engineを達成することができています

以下を含むassembly.server.routes.jsにアプリ取り
// regex to narrow the scope of code experimenting 
if (module.re('assemblys')) { 
    // === var render here? === 
    require(routes)(app); 
    } 

:assembly.server.controllers.jsで、その後

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


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

を、私は、アセンブリの機能を提供しようとするが、それは動作しません - 404:私はfunction *()renderを渡すとき

// 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}); 
    }); 
}; 

は以前、私は、すぐそこview_path使用できるようにするcore.configs内var renderを入れたが、エラーとアプリクラッシュが発生しました。 core.configsにあったレンダリングするとき、私はこれを輸出routes.jsファイル持っていた:

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

をいくつか興亜の例は、このapp.use(route.get('/assembly', function *() { });routeを使用して言うと、私はいくつかの他の例は、単にこの

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スタックトレースによる更新。 私は共同ビューサービスを使用しています。私のpackages.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}); 
}; 
関連する問題