Ostatnio przygotowuje parę pomocnych helpersów do projektów opartych na expressie. Związku z tym próbuje ujarzmić jądro EJS.
To zacznijmy od kodu, setup serwisu:
// server.js
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const Provider = require('./providers/provider');
const EnviromentLoader = require('./loaders/EnviromentLoader');
const ServicesLoader = require('./loaders/ServicesLoader');
const SecurityManager = require('./utils/SecurityManager');
EnviromentLoader.setEnviroment(app);
ServicesLoader.loadServices(app);
app.engine('ejs', require('express-ejs-extend'));
app.use(express.static(__dirname + '/static'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
Provider.loadProviders(app);
app.use(app.get('SessionProvider').createSession());
app.use('/', SecurityManager(app.get('config')));
require('./routing/Routes')(app);
var port = process.env.PORT || 8100;
app.listen(port);
console.log('Projekt_random_cup is running ' + port);
Provider dostarcza EJSExtension do midleware app.
const SessionProvider = require('./SessionProvider');
const EJSExtension = require('../utils/EJSExtension');
const Provider = {
loadProviders: function(app) {
EJSExtension.setConfig(app.get('config'));
app.set('SessionProvider', SessionProvider);
app.set('EJSExtension', EJSExtension);
}
}
module.exports = Provider;
Następnie EJSExtension dostarcza metody pomocnicze:
const EJSExtension = {
config: '',
engine: {},
fs: {},
setConfig: function(config) {
this.config = config;
this.engine= require('ejs');
this.fs = require('fs');
},
assets: function(file) {
const basePath = this.config.assetsSetings.basic_url;
const cssUrl = 'css/pages/';
const url = `${basePath}${cssUrl}${file}.css`;
var compiled = this.engine.compile(this.fs.readFileSync(__dirname + '/../views/helpers/assets/css.ejs', 'utf8'));
var html = compiled({ url: url });
return html;
}
}
module.exports = EJSExtension;
Które baseControler dostarcza do innych kontrolerów, a te do templateRender (EJS)
<% extend('layouts/template') %>
<section class="mainPage__topContainer">
<div class="mainPage__slider">
<% include components/notice/slider %>
</div>
<% if (!session.isLogged) { %>
<div class="mainPage__form">
<% include components/forms/login %>
</div>
<% } %>
</section>
<%= helpers.assets('main') %>
I tu wszystko działa, ale nie wrzuca mi domElement ale String, według moje spostrzeżenia (patrząc na console,logi jakie miała biblioteka) w oógle nie leci do templateRender, tylko do innej metody (jeszcze nie rozkminiłem gdzie), pytanie czy jest taka możlwość by zaczęło robić to co ma robić. Wiem, że w twig-u da się takie fajne ficzerki robić.
EDIT: Problem rozwiązany, należało zmienić znak w znaczniku.
<%- helpers.assets('main') %>
A nigdziie w dokumentacji tego nie napisali xd.