NodeJs用jsPDF说“ ReferenceError:未定义窗口”

时间:2018-11-09 05:58:23

标签: node.js jspdf

我正在使用NodeJs和jsPDF创建一个示例项目。当我运行时,它会回显ReferenceError: window is not defined。我还使用了John Gordonhere答案,但还是同样的问题。

我尝试过

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 :(得分:2)

指定的软件包jspdf是一个仅用于客户端的库,需要在浏览器环境中使用才能正常工作。

说明在软件包主页中很清楚:

  

一个用于在客户端JavaScript中生成PDF的库。

现在,提供npm软件包的原因是因为Webpack和Browserify等捆绑程序可以加载npm软件包并将其转换为与浏览器兼容的适当脚本。 require()未在浏览器环境中定义,没有这些捆绑器将无法使用。

因此,要么选择支持NodeJS的库,例如 https://www.npmjs.com/package/pdfkit或将与PDF相关的代码移至浏览器并使用它。

编辑: 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();
   // ...
}

答案 1 :(得分:2)

您需要做的就是在顶部删除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;

希望这会有所帮助!

答案 2 :(得分:0)

您可以将script标签放在html页面的head或body标签中,任何一个都可以。要确定放置位置,this answer可能会有所帮助