123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- const _render = require('./page-renderer');
- const _path = require('path');
- const _fs = require('fs-magic');
- const _jsonReader = require('./json-reader');
- // wrapper to add custom options
- async function createDispatcher(options={}){
- // merge options
- const opt = {
- template: options.template || _path.join(__dirname, '../assets/template.ejs'),
- css: options.css || _path.join(__dirname, '../assets/layout.css'),
- lang: options.lang || 'en_US',
- footer: options.footer || null
- };
- // load page template
- const tpl = await _fs.readFile(opt.template, 'utf8');
- // load styles
- const css = await _fs.readFile(opt.css, 'utf8');
-
- // load page definitions
- const pages = await _jsonReader(_path.join(__dirname, '../i18n/pages-' + opt.lang + '.json'));
- // multi-type support
- // @see https://github.com/expressjs/express/blob/master/examples/error-pages/index.js
- return function dispatchRequest(page, httpStatusCode, req, res){
- // page available ?
- if (!pages[page]){
- // use "internal server error" as default
- page = '500';
- httpStatusCode = null;
- }
- // set http status code
- res.status(httpStatusCode || 500);
- // extract page date
- const pageData = pages[page];
- // multiple response formats
- res.format({
- // standard http-error-pages
- html: function(){
- res.type('.html');
- res.send(_render(tpl, css, {
- code: httpStatusCode,
- title: pageData.title,
- message: pageData.message,
- footer: opt.footer
- }))
- },
- // json
- json: function(){
- res.json({
- error: pageData.title + ' - ' + pageData.message
- })
- },
- // text response
- default: function(){
- // plain text
- res.type('.txt').send(pageData.title + ' - ' + pageData.message);
- }
- })
- }
- }
- module.exports = createDispatcher;
|