我正在使用NodeJs和jsPDF创建一个示例项目。当我运行时,它会回显ReferenceError: window is not defined
。我还使用了John Gordon的here答案,但还是同样的问题。
我尝试过
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;
答案 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可能会有所帮助