tailor
tailor copied to clipboard
Missing example of tailor consuming a template storage.
Hello, I'm trying to consume templates from a storage, but I'm only getting the response 'template not found'.
'use strict'
const http = require('http')
const Tailor = require('node-tailor')
const tailor = new Tailor({
templatesPath: 'https://s3.example.com.br' + '/templates'
})
http
.createServer((req, res) => {
if (req.url === '/favicon.ico') {
res.writeHead(200, { 'Content-Type': 'image/x-icon' })
return res.end('')
}
req.headers['x-request-uri'] = req.url
tailor.requestHandler(req, res)
})
.listen(8080, function() {
console.log('Tailor server listening on port 8080')
})
There is any example or documentation about this?
Local directory works:
const tailor = new Tailor({
templatesPath: __dirname + '/templates'
})
I implemented it my way, created a new file template-storage.js
based on fetch-template.js
from tailor:
"use strict";
const http = require("http");
const url = require("url");
const TEMPLATE_ERROR = 0;
const TEMPLATE_NOT_FOUND = 1;
class TemplateError extends Error {
constructor(...args) {
super(...args);
this.code = TEMPLATE_ERROR;
this.presentable = "Template Error";
const [{ statusCode }] = args;
if (statusCode === 404) {
this.code = TEMPLATE_NOT_FOUND;
this.presentable = "Template Not Found";
}
}
}
/**
* Returns pathname by request
*
* @param {Object} request - Request Object
*
* @return {String} pathname
*/
const getPathName = (request) => url.parse(request.url, true).pathname;
/**
* Fetches the template from storage
*/
module.exports = () => async (request, parseTemplate) => {
const pathname = getPathName(request);
return parseTemplate(
await new Promise((resolve, reject) => {
const req = http.get(
`http://s3.example.com.br/templates${pathname}.html`
);
req.on("response", (res) => {
let data = "";
res.on("data", (chunk) => (data += chunk));
res.on("end", () => {
if (res.statusCode !== 200) {
reject(new TemplateError(res));
}
resolve(data);
});
});
req.on("error", (err) => {
console.log("Error: " + err.message);
reject(err);
});
})
);
};
module.exports.TEMPLATE_ERROR = TEMPLATE_ERROR;
module.exports.TEMPLATE_NOT_FOUND = TEMPLATE_NOT_FOUND;
and updated my index.js
:
"use strict";
const http = require("http");
const Tailor = require("node-tailor");
const TemplateStorage = require("./template-storage");
const PORT = process.env.PORT || 8080;
const tailor = new Tailor({
// templatesPath: __dirname + '/templates', // local templates only
fetchTemplate: TemplateStorage(),
});
http
.createServer((req, res) => {
if (req.url === "/favicon.ico") {
res.writeHead(200, { "Content-Type": "image/x-icon" });
return res.end("");
}
req.headers["x-request-uri"] = req.url;
tailor.requestHandler(req, res);
})
.listen(PORT, function () {
console.log(`Tailor server listening on port ${PORT}`);
})
.on("error", (req, err) => console.error(err));