const PizZip = require('pizzip'); const Docxtemplater = require('docxtemplater'); const fs = require('fs'); const path = require('path'); // The error object contains additional information when logged with JSON.stringify (it contains a properties object containing all suberrors). function replaceErrors(key, value) { if (value instanceof Error) { return Object.getOwnPropertyNames(value).reduce(function (error, key) { error[key] = value[key]; return error; }, {}); } return value; } function errorHandler(error) { console.log(JSON.stringify({ error: error }, replaceErrors)); if (error.properties && error.properties.errors instanceof Array) { const errorMessages = error.properties.errors.map(function (error) { return error.properties.explanation; }).join("\n"); console.log('errorMessages', errorMessages); // errorMessages is a humanly readable message looking like this : // 'The tag beginning with "foobar" is unopened' } throw error; } module.exports = function (templateInfo, fileName) { return new Promise((resolve, reject) => { for (const key in templateInfo) { if (!templateInfo[key]) { throw({ eCode: 406, eText: 'empty fields' }) } } let content = fs.readFileSync(path.resolve(__dirname, `../template/${fileName}`), 'binary'); let zip = new PizZip(content); let doc; try { doc = new Docxtemplater(zip); } catch (error) { errorHandler(error); } doc.setData(templateInfo); try { doc.render() } catch (error) { errorHandler(error); } let buf = doc.getZip().generate({ type: 'nodebuffer' }); fs.writeFileSync(path.resolve(__dirname, `../public/files/${templateInfo.firstName}-${templateInfo.lastName}-${fileName}`), buf); resolve(`http://localhost:3000/users/download/${templateInfo.firstName}-${templateInfo.lastName}-${fileName}`) .catch(err => { reject({ eCode: 500, eText: err }) }) }) }