2016-08-30 4 views
3

Meine Bemühung ist, meine APP von Express zu Koa umzubauen, also arbeiten routes.js und controllers.js vorher. Ich versuche, einen kleinen Mechanismus zu erstellen, um Vorlage in Koa zu rendern. Das Ziel ist es, den Arbeitscode für andere Module laden verschiedene Vorlage-Engines automatisch durch Render-Variable Aufruf von module.view_engine pro module.routes. Kannst du helfen?Wie man Vorlage mit Koa rendert

+---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 

Das ist meine Verzeichnisstruktur. Mit ein paar Lodash jede Schleife, ich bin in der Lage view_path, Routen, view_engine pro Modul in core.koa.configs.js

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

In der gleichen Datei zu erreichen, mit module noch innerhalb der _.each Schleife, ich nenne

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

, dass die App auf die assembly.server.routes.js mit folgendem Inhalt nimmt:

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


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

Dann in der assembly.server.controllers.js, Ich versuche, die Montage-Funktion zur Verfügung zu stellen, aber es funktioniert nicht - 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}); 
    }); 
}; 

Zuvor Ich habe var render in dem core.configs der Lage sein, view_path genau dort zu verwenden, aber wenn ich dann passieren render in function *(), Ich habe Fehler und App-Absturz! Wenn in core.configs war render, hatte ich die routes.js Datei exportieren diese:

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

Einige Beispiele Koa sagt mit route in diesem app.use(route.get('/assembly', function *() { }); und ich sah nur einige weitere Beispiele dieses

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

Ich bevorzuge Letzteres. Aber Probleme mit yield render und wie man app, rendern Parameter in den function *(app,render) Generator, habe ich versucht, aber es funktioniert auch nicht. Fehler beim Stack-Trace.

Die Idee Ergebnis ist in core.koa.configs.js haben:

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

leitet dann den Export

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

und der Controller ist in der Lage, die assemblys zu machen:

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

Update: Siehe stack-traces, siehe koa branch_commit. -compiled.js.map Dateien wurden von ES6-Babel generiert

+0

Haben Sie eine Logging-Informationen von der Konsole über die 404 die Sie erhalten? Würde mich nicht wundern, wenn es wie erwartet funktioniert, aber der 404 kommt aus Ihrer Pug-Datei. – doublesidedstickytape

+0

Vielen Dank für Ihre Eingabe. http://imgur.com/a/A79vG Update mit Stack-Traces. Ich verwende Co-Views-Service, benötigen Sie meine packages.json? –

Antwort

0

Koa (anders als Express) wartet nicht, bis Sie den Antworttext festlegen. Wenn Ihre Middleware-Funktion beendet ist und der Antworttext leer ist, wird eine 404-Antwort angezeigt. Deshalb sollten Sie in Koa Rückrufe vermeiden oder sie promi- tieren.

Hier ist, wie Sie Ihre Middleware-Funktion in koa-Stil aussehen sollte:

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}); 
}; 
Verwandte Themen