NodeJs говорит "ReferenceError: окно не определено" с jsPDF - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю пример проекта с NodeJs и jsPDF.Когда я бегу, это эхом ReferenceError: window is not defined.Я также использовал Джон Гордон ответ от здесь , но опять же та же проблема.

Я пытался с

var express = require('express');
var jsPDF = require('jspdf');
var app = express();

app.get('/', function(req, res)
{
    global.window = {document: {createElementNS: () => {return {}} }};
    global.navigator = {};
    global.btoa = () => {};

    var fs = require('fs');
    var jsPDF = require('jspdf');
    var jsPDFTable = require('jspdf-autotable');

    var doc = new jsPDF();
    doc.text("Hello", 10, 10);
    var data = doc.output();

    fs.writeFileSync('./tmp/storage/pdf/document.pdf', data);

    delete global.window;
    delete global.navigator;
    delete global.btoa;
});

var port = process.env.PORT || 8080;
app.listen(port);
console.log('Server started');

module.exports = app;

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Указанный пакет jspdf является библиотекой только для клиента и должен использоваться в среде браузера для правильной работы.

Описание ясно на домашней странице пакета:

Библиотека для создания PDF-файлов в клиентском JavaScript.

Теперь причина в наличии пакета npm заключается в том, что такие упаковщики, как Webpack и Browserify, могут загружать пакеты npm и преобразовывать их в соответствующий скрипт, совместимый с браузером. require() не определен в среде браузера и не будет работать без этих упаковщиков.

Итак, либо выберите библиотеку, которая поддерживает NodeJS, например https://www.npmjs.com/package/pdfkit или перенесите код, связанный с PDF, в браузер и работайте с ним.

EDIT: https://github.com/MrRio/jsPDF/issues/566#issuecomment-382039316

показывает, что вы можете использовать библиотеку в NodeJS env, внеся следующие изменения.

В этом случае вам нужно определить глобальные переменные перед require использованием модуля.

global.window = {document: {createElementNS: () => {return {}} }};
global.navigator = {};
global.btoa = () => {};

var fs = require('fs');
var jsPDF = require('jspdf');
var jsPDFTable = require('jspdf-autotable'); 
var app = require('express')();



app.get('/', function(req, res)
{
   var doc = new jsPDF();
   // ...
}
0 голосов
/ 09 ноября 2018

Все, что вам нужно сделать, это удалить ваш var jsPDF = require('jspdf'); сверху и получить аналогичное объявление внутри вашей app.get.. (которая у вас уже есть) функции, подобной этой,

var express = require('express');
var app = express();

app.get('/', function(req, res)
{
    global.window = {document: {createElementNS: () => {return {}} }};
    global.navigator = {};
    global.btoa = () => {};

    var fs = require('fs');
    var jsPDF = require('jspdf');
    var jsPDFTable = require('jspdf-autotable');

    var doc = new jsPDF();
    doc.text("Hello", 10, 10);
    var data = doc.output();

    fs.writeFileSync('./document.pdf', data);

    delete global.window;
    delete global.navigator;
    delete global.btoa;
});

var port = process.env.PORT || 8080;
app.listen(port);
console.log('Server started');

module.exports = app;

Надеюсь, это поможет!

0 голосов
/ 09 ноября 2018

Вы можете разместить тег script в теге head или body на html-странице, любой из них подойдет. Чтобы решить, где разместить, этот ответ может помочь

...