Relatorio Nao funciona

Desenvolvi um relatório utilizando html-pdf no #web-apps:nodejs, localmente funciona fiz um teste em minha maquina e no meu celular. Porem quando subo os arquivos e tento gerar o relatório aparece alguns erros:

A variavel que ele fala que esta null porem nao esta, ja testei fixando um valor ele pula para um proximo erro. É como se estivesse faltando alguma biblioteca/arquivo na pasta node_modules, porem não esta.

segue um trecho.
at /usr/src/app/node_modules/express/lib/router/index.js:635:15
Mar 22 23:34:32 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 22 23:34:32 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 22 23:34:32 at /usr/src/app/node_modules/express/lib/router/index.js:284:7
Mar 22 23:34:32 at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
Mar 22 23:34:32 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 22 23:34:32 at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
Mar 22 23:34:32 at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
Mar 22 23:34:32 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 22 23:34:32 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 22 23:34:32 at /usr/src/app/node_modules/express/lib/router/index.js:281:22
Mar 22 23:34:32 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 22 23:34:32 at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:112:3)
Mar 22 23:34:32 at next (/usr/src/app/node_modules/express/lib/router/route.js:137:13)
Mar 22 23:34:32 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 22 23:34:32 at /usr/src/app/routes/relatorio.js:21:17
Mar 22 23:34:32 TypeError: Cannot read property ‘tipoUsuario’ of null

Olá. @silvio! Tudo bem?
Se você está usando a estrutura onde a importação dos módulos ocorre no início do arquivo .js, ocorreria o erro Cannot find module “nomedomodulo” ao iniciar a sua aplicação, não parece ser o caso :smiley:
Quanto ao erro apresentado, vamos supor uma linha assim:

console.log(nomedoobjeto.nomedapropriedade);

Se ocorrer o erro do Cannot read property ‘nomedapropriedade’ of null realmente, ocorre quando o objeto contém o valor null. O fato de não ocasionar o mesmo erros após um objeto ser definido manualmente para essa variável prova que o problema é que essa variável é nula quando chega na linha onde ela é necessitada. Colocar um console.log antes dessa chamada lhe mostrará isso. Exemplo:

console.log("Valor do objeto:", nomedoobjeto); //Imprimirá no console "Valor do objeto: null"
console.log(nomedoobjeto.nomedapropriedade); //Ocorrerá o erro

O fato deste código funcionar localmente sugere que há alguma diferença onde ele recebe um objeto válido localmente. Talvez uma conexão com o banco de dados que não está configurada corretamente para funcionar na hospedagem?
Ou um banco de dados diferente onde não existe esse dado que ele está buscando?
Além de outros possíveis problemas que podem estar ocasionando isso

Ola @ThFnsc,
Rapaz ja coloquei console.log localmente mostra valor ja na hospedagem nao, porem ja verifiquei nos dois banco de dados, ate rodei minha aplicação local conectando com o banco do provedor e rodou perfeito, por isso acho q seja alguma incompatibilidade ou procedimento especifico p rodar no provedor que esta passando despercebido.
No provedor alem do erro listado mostra o seguinte log também.

Mar 23 16:08:56 at /usr/src/app/node_modules/express/lib/router/index.js:635:15
Mar 23 16:08:56 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 23 16:08:56 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 23 16:08:56 at /usr/src/app/node_modules/express/lib/router/index.js:284:7
Mar 23 16:08:56 at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
Mar 23 16:08:56 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 23 16:08:56 at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
Mar 23 16:08:56 at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
Mar 23 16:08:56 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 23 16:08:56 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 23 16:08:56 at /usr/src/app/node_modules/express/lib/router/index.js:281:22
Mar 23 16:08:56 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 23 16:08:56 at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:112:3)
Mar 23 16:08:56 at next (/usr/src/app/node_modules/express/lib/router/route.js:137:13)
Mar 23 16:08:56 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 23 16:08:56 at /usr/src/app/routes/relatorio.js:21:17
Mar 23 16:08:56 TypeError: Cannot read property ‘tipoUsuario’ of null
Mar 23 16:08:55 at /usr/src/app/node_modules/express/lib/router/index.js:635:15
Mar 23 16:08:55 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 23 16:08:55 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 23 16:08:55 at /usr/src/app/node_modules/express/lib/router/index.js:284:7
Mar 23 16:08:55 at trim_prefix (/usr/src/app/node_modules/express/lib/router/index.js:317:13)
Mar 23 16:08:55 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 23 16:08:55 at router (/usr/src/app/node_modules/express/lib/router/index.js:47:12)
Mar 23 16:08:55 at Function.handle (/usr/src/app/node_modules/express/lib/router/index.js:174:3)
Mar 23 16:08:55 at next (/usr/src/app/node_modules/express/lib/router/index.js:275:10)
Mar 23 16:08:55 at Function.process_params (/usr/src/app/node_modules/express/lib/router/index.js:335:12)
Mar 23 16:08:55 at /usr/src/app/node_modules/express/lib/router/index.js:281:22
Mar 23 16:08:55 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)
Mar 23 16:08:55 at Route.dispatch (/usr/src/app/node_modules/express/lib/router/route.js:112:3)
Mar 23 16:08:55 at next (/usr/src/app/node_modules/express/lib/router/route.js:137:13)
Mar 23 16:08:55 at Layer.handle [as handle_request] (/usr/src/app/node_modules/express/lib/router/layer.js:95:5)

Puts, que situação :grimacing:
Poderia mandar o log novamente e mais completo?
As partes mais importantes devem estar abaixo disso :sweat_smile:

Fala dr, nao enviei antes pois estava tentando descobrir a solução sem sucesso.
mas veja ai o codigo completo.

Servidor iniciado na porta 3000!
Apr 03 23:19:35
Apr 03 23:19:35 > node app
Apr 03 23:19:35 > grinvesting@1.0.0 start /usr/src/app
Apr 03 23:19:35
Apr 03 23:19:32 npm ERR! /usr/src/app/.npm/_logs/2020-04-04T02_19_32_167Z-debug.log
Apr 03 23:19:32 npm ERR! A complete log of this run can be found in:
Apr 03 23:19:32
Apr 03 23:19:32 npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
Apr 03 23:19:32 npm ERR! Failed at the grinvesting@1.0.0 start script.
Apr 03 23:19:32 npm ERR!
Apr 03 23:19:32 npm ERR! Exit status 1
Apr 03 23:19:32 npm ERR! grinvesting@1.0.0 start: node app
Apr 03 23:19:32 npm ERR! errno 1
Apr 03 23:19:32 npm ERR! code ELIFECYCLE
Apr 03 23:19:32 }
Apr 03 23:19:32 operator: ‘==’
Apr 03 23:19:32 expected: true,
Apr 03 23:19:32 actual: false,
Apr 03 23:19:32 code: ‘ERR_ASSERTION’,
Apr 03 23:19:32 generatedMessage: false,
Apr 03 23:19:32 at processImmediate (internal/timers.js:439:21) {
Apr 03 23:19:32 at Immediate._onImmediate (/usr/src/app/node_modules/express-handlebars/lib/utils.js:18:13)
Apr 03 23:19:32 at /usr/src/app/routes/relatorio.js:102:29
Apr 03 23:19:32 at Object.createPdf [as create] (/usr/src/app/node_modules/html-pdf/lib/index.js:10:14)
Apr 03 23:19:32 at new PDF (/usr/src/app/node_modules/html-pdf/lib/pdf.js:39:3)
Apr 03 23:19:32 AssertionError [ERR_ASSERTION]: html-pdf: Can’t create a pdf without an html string
Apr 03 23:19:32
Apr 03 23:19:32 ^
Apr 03 23:19:32 throw err;
Apr 03 23:19:32 assert.js:374

Ahá!
Observe essa linha:

Basicamente, parece que o módulo que gera os PDFs tem uma verificação antes de executar que verifica se foi enviado um HTML correto. Parece que ele está reclamando que esse HTML não existe :grimacing:
Talvez seja interessante verificar nas linhas anteriores se o HTML foi criado corretamente

Thiago solucionado, fiz umas modificações e deu certo, não e a melhor solução mas para meu projeto atende perfeitamente.
Colocando aqui para caso alguém tenha o mesmo problema que o meu.
Antes eu esta gerando o relatório em cache e mostrando no navegador e quando o usuario fechava ele ja excluia, porem so estava dando certo localmente no servidor nao.
A SOLUÇÃO: Gero o relatorio salvo o arquivo no servidor e depois excluo.
.
.
.
.
pdf.create(html, pagina).toFile("./public/pdf/" + idCliente + ‘relatorio.pdf’,
function (erro, data, callback) {
if (erro) return console.log(erro);
fs.readFile(’./public/pdf/’ + idCliente + ‘relatorio.pdf’, function (erro, data) {
if (erro) {
console.log(“Erro nao foi possivel abrir o arquivo”, erro);
process.exit(1);
}
res.type(‘application/pdf’);
res.send(data);
console.log(‘Arquivo Gerado com sucesso’);
//Aqui eu excluo o arquivo
fs.unlinkSync(’./public/pdf/’ + idCliente + ‘relatorio.pdf’);
//Só um gera um log p eu monitorar no provedor
console.log(“arquivo Removido”);
});
});

Valeu Pela força

Maravilha, @silvio!
Obrigado por compartilhar com nós a sua solução :smiley:
Se me permitir, eu tenho uma dica que pode melhorar esse código!
Pois a lógica dele no momento é ler o arquivo PDF inteiro para a memória e depois enviar esse buffer para o navegador.
Essa talvez não seja a maneira ideal de se fazer isso, pois pode ocorrer um pico de uso de memória considerável se o PDF for meio grande. Além de que ele só começa a enviar depois de já ter terminado de ler todo o arquivo.

Recomendo substituir por algo assim:

var arquivo='./public/pdf/' + idCliente + 'relatorio.pdf';
pdf.create(html, pagina).toFile(arquivo,
function (erro, data, callback) {
    if (erro) return console.log(erro);
    res.type('application/pdf');
    var stream = fs.createReadStream(arquivo);
    stream.on("end", () => fs.unlink(arquivo, () => console.log("Arquivo removido")));
    stream.pipe(res);
});

Dessa maneira, Ele não lê o arquivo tudo de uma vez só. Ele apenas cria uma stream para o arquivo. Essa stream então é redirecionada para a resposta. É uma maneira muito mais eficiente, pois ele vai enviado o arquivo por partes dinamicamente enquanto o lê. Não usando muita memória em nenhum momento e começando a enviar o arquivo imediatamente :smile:

pdf.create(data,config).toStream(function (err,stream) {
stream.pipe(fs.createWriteStream(arquivo));
res.type(“application/pdf”);
fs.createReadStream(arquivo);
stream.pipe(res);

        });

Dessa forma acima tambem funciona