Helper dbHandler.connect('postgres://jsreports:
-
@jan_blaha we have two postgres DBs we need to get data from the same user for both DB on AWS RDS whats the best way to handle this with user name and password set once?
function beforeRender(req, res, done) { dbHandler.connect('postgres://jsreports:#######>********@****-ro-replica.********.us-east-2.rds.amazonaws.com:5432/postgres', function (err) { if (err) { return done(err) } dbHandler.query('SELECT signup_date, total_customer FROM public.account_signup_day', function (err, results) { if (err) { return done(err) } // next line fill the data that your current report is going to use req.data = results // results should be containing the data of your query (array, object, etc) done() }) }
-
It is about where to store the postgres username and password?
You can store it in the environment variables.
Both options are described in the documentation here
https://jsreport.net/learn/scripts
-
Do i need to
npm install pg
for Postgres db connection or 3.4 have that built-in too?
-
Something like this but it did not work
const {accounts} = require('pg'); const db = new accounts({ user: 'domo', host: '***-ro-replica.*********.us-east-2.rds.amazonaws.com', database: 'ats_whitelabel', password: '*******************', port: 5432, }); db.connect(); function beforeRender(req, res, done) { let query = "SELECT * from accounts"; query += " ORDER BY id LIMIT 25"; db.query(query, (err, result) => { req.data = { rows: result.rows }; db.end(); done(); }); }
where table is accounts, database is ats_whitelabel
-
@jan_blaha Can you confirm if the connection format is correct as I was not able to connect to the DB
-
jsreport doesn't have external third-party modules built-in.
You can try the code in the plain nodejs and test it works properly.
If you have questions regarding the usage of a particular library, please refer to the documentation and github page of that particular lib.Everything that works in nodejs should work in jsreport.
-
I have a new client and it's been over 1.5 years since worked with jsreports. You have made lots of new progress. We are going to use this for a sales dashboard, I hope. @jan_blaha Ok made progress, and I appreciated the help. Thanks for helping me get over the hump of getting things going again.
Have a helper file but get an error when I run it.
node helpers.js node:internal/bootstrap/switches/does_own_process_state:126 cachedCwd = rawMethods.cwd(); ^ Error: ENOENT: no such file or directory, uv_cwd at process.wrappedCwd [as cwd] (node:internal/bootstrap/switches/does_own_process_state:126:28) at node:path:1082:24 at Object.resolve (node:path:1096:39) at resolveMainPath (node:internal/modules/run_main:19:40) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:71:24) at node:internal/main/run_main_module:17:47 { errno: -2, code: 'ENOENT', syscall: 'uv_cwd' } Node.js v17.7.2
helper.js
function now() { return new Date().toLocaleDateString() }; const pg = require('pg') const config = { host: 'dev11-********************.us-east-2.rds.amazonaws.com', port: '5432', password: 'K****************************9', user: 'd**o', database: 'ats_whitelabel' } const pool = new Pool(config); pool.connect((err, client, done) => { if (err) throw err; client.query('SELECT username, email, registration_status, brand_id, balance FROM accounts WHERE brand_id = 3', (err, res) => { if (err) console.log(err.stack); else { console.log(res.rows); } pool.end() }) })
content.handlebars
<h1> Player KYC Status </h1> <td> <br> Created: {{now}} <br> Brand: {{brand_id}} </td> <div> <span>Username: {{username}}</span> <span>Email: {{email}}</span> <span>Registration Status: {{registration_status}}</span> </div>
Report "SDGPN_Player_Status" render failed. Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } (sandbox.js line 4:12) 667 | return new Date().toLocaleDateString() 668 | }; > 669 | const pg = require('pg') | ^ 670 | const config = { 671 | host: 'dev11-ro-replica.ca8zbbworcoy.us-east-2.rds.amazonaws.com', 672 | port: '5432', Error: require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } at _require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:78:19) at require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:111:21) at BaseHandler.apply (/home/ubuntu/jsreportapp/node_modules/vm2/lib/bridge.js:477:11) at sandbox.js:669:12
-
if i add allowedModules": 'pg' i get different error
unction now() { return new Date().toLocaleDateString() }; const pg = require('pg') const config = { host: 'dev11-ro-replica.ca8zbbworcoy.us-east-2.rds.amazonaws.com', port: '5432', password: 'KKpu3wnCrWKBUrSghtqz9Yt2Kn6GkMc9', user: 'domo', database: 'ats_whitelabel', allowedModules": 'pg' }
node:internal/bootstrap/switches/does_own_process_state:126 cachedCwd = rawMethods.cwd(); ^ Error: ENOENT: no such file or directory, uv_cwd at process.wrappedCwd [as cwd] (node:internal/bootstrap/switches/does_own_process_state:126:28) at node:path:1082:24 at Object.resolve (node:path:1096:39) at resolveMainPath (node:internal/modules/run_main:19:40) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:71:24) at node:internal/main/run_main_module:17:47 { errno: -2, code: 'ENOENT', syscall: 'uv_cwd' }
report run error
Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status Unterminated string constant (676:18) SyntaxError: Unterminated string constant (676:18) at Parser.pp$4.raise (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3460:15) at Parser.pp.readString (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:5318:35) at Parser.pp.getTokenFromCode (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:5091:19) at Parser.pp.readToken (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:4815:17) at Parser.pp.nextToken (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:4806:17) at Parser.pp.next (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:4767:10) at Parser.pp$5.parseIdent (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3393:10) at Parser.pp$5.parsePropertyName (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3195:111) at Parser.pp$5.parseProperty (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3122:10) at Parser.pp$5.parseObj (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3076:23)
-
ebug+0Rendering engine handlebars warn+35Error when processing render request 29 Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } (sandbox.js line 4:12) 667 | return new Date().toLocaleDateString() 668 | }; > 669 | const pg = require('pg') | ^ 670 | const config = { 671 | host: 'dev11-ro-replica.ca8zbbworcoy.us-east-2.rds.amazonaws.com', 672 | port: '5432', Error: require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } at _require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:78:19) at require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:111:21) at BaseHandler.apply (/home/ubuntu/jsreportapp/node_modules/vm2/lib/bridge.js:477:11) at sandbox.js:669:12 warn+0Rendering request 29 finished with error in 38 ms
-
or if you use
function now() { return new Date().toLocaleDateString() }; import pg from 'pg'; const config = { host: 'dev11-ro-replica.ca8zbbworcoy.us-east-2.rds.amazonaws.com', port: '5432', password: 'KKpu3wnCrWKBUrSghtqz9Yt2Kn6GkMc9', user: 'domo', database: 'ats_whitelabel', allowedModules: 'pg' }
error
Report "SDGPN_Player_Status" render failed. Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status 'import' and 'export' may only appear at the top level (669:0) SyntaxError: 'import' and 'export' may only appear at the top level (669:0) at Parser.pp$4.raise (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3460:15) at Parser.pp$8.parseStatement (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:928:18) at Parser.pp$8.parseBlock (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:1232:23) at Parser.pp$5.parseFunctionBody (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3286:24) at Parser.pp$5.parseArrowExpression (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:3247:10) at Parser.pp$5.parseSubscript (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:2698:21) at Parser.pp$5.parseSubscripts (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:2646:26) at Parser.pp$5.parseExprSubscripts (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:2630:23) at Parser.pp$5.parseMaybeUnary (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:2593:19) at Parser.pp$5.parseExprOps (/home/ubuntu/jsreportapp/node_modules/acorn/dist/acorn.js:2520:21)
-
if i add allowedModules": 'pg' i get different error
You need to set
"allowLocalFilesAccess": true
or{ sandbox: { allowedModules": ["pg"] }
'import' and 'export' may only appear at the top level (669:0)
Use
require
instead...Generally, you should connect to the database and fetch data rather in the
beforeRender
part of the custom script.
https://jsreport.net/learn/scripts
-
I have added
{ sandbox: { allowedModules": ["pg"] }
"extensions": { "authentication": { "cookieSession": { "secret": "agaQ_9j0eedP2quZ" }, "admin": { "username": "sdadmin", "password": "T*****g" }, "enabled": true }, "sandbox": { "allowedModules": ["pg"] },
error
warn: Error when processing render request 1 Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } (sandbox.js line 4:12) 667 | return new Date().toLocaleDateString() 668 | }; > 669 | const pg = require('pg') | ^ 670 | const config = { 671 | host: 'dev11-ro-replica.ca8zbbworcoy.us-east-2.rds.amazonaws.com', 672 | port: '5432', Error: require of "pg" module has been blocked. To be able to require custom modules you need to add to configuration { "allowLocalFilesAccess": true } or enable just specific module using { sandbox: { allowedModules": ["pg"] } at _require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:78:19) at require (/home/ubuntu/jsreportapp/node_modules/@jsreport/jsreport-core/lib/worker/sandbox/safeSandbox.js:111:21) at BaseHandler.apply (/home/ubuntu/jsreportapp/node_modules/vm2/lib/bridge.js:477:11) at sandbox.js:669:12 rootId=gz8c5ae7pjimdx0, id=gz8c5ae7pjimdx0 2022-03-28T11:36:20.504Z - warn: Rendering request 1 finished with error in 779 ms rootId=gz8c5ae7pjimdx0, id=gz8c5ae7pjimdx0
What is the best approach to getting the Postgres data from rds? FYI some tables will have millions of records.
-
It should be in the root, not nested in the "extensions"
"sandbox": { "allowedModules": ["pg"] }
-
Go it thank that worked.
Now have issue it does not like pool
Report "SDGPN_Player_Status" render failed. Error when evaluating engine handlebars for template /PD-report/SDGPN_Player_Status Pool is not defined (sandbox.js line 14:14) 677 | } 678 | > 679 | const pool = new Pool(config); | ^ 680 | pool.connect((err, client, done) => { 681 | if (err) throw err; 682 | client.query('SELECT username, email, registration_status, brand_id, balance FROM accounts WHERE brand_id = 3', (err, res) => { ReferenceError: Pool is not defined at sandbox.js:679:14
-
This is a very basic example that works for me
const { Client } = require('pg') const client = new Client({ host: "localhost", port: 5432, database: "jsreport", user: "postgres", password: "password" }) async function beforeRender (req) { await client.connect() const res = await client.query('SELECT $1::text as message', ['Hello world!']) req.data.rows = res.rows await client.end() }
-
With out pool that worked thanks