员工移动了,只剩下我这个代码,曾经努力生成PDF。我已经没有任何运气试图调试 - 断点,甚至console.logs - 在底部这里列出的脚本;有没有一种方法来搜索在Visual Studio中加载脚本的巨大的名单?
C#错误:
{System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.IO.IOException: The server returned an invalid or unrecognized response.
at System.Net.Http.HttpConnection.FillAsync()
客户端错误:(这是因为服务器永远不会返回什么?)
ERROR Error: Uncaught (in promise): DataCloneError: Failed to execute 'postMessage' on 'Worker': TypeError: Failed to fetch could not be cloned.
Error: Failed to execute 'postMessage' on 'Worker': TypeError: Failed to fetch could not be cloned.
at MessageHandler.postMessage (pdf.js:12334)
at sendStreamRequest (pdf.js:12151)
at Object.error (pdf.js:12194)
at eval (pdf.js:8419)
at ZoneDelegate.invoke (zone.js:392)
控制方法
public async Task<IActionResult> Generate(string id)
{
try
{
var stream = await _reportService.GenerateReportAsync(id);
return new FileStreamResult(stream, "application/pdf");
}
catch(Exception ex)
{
throw;
}
}
服务方式:
public async Task<Stream> GenerateReportAsync(string id)
{
return await Services.InvokeAsync<Stream>("./Node/generate-pdf.js", Configuration.Url, id, new { format = "A4" });
}
产生-pdf.js:
const pdf = require('html-pdf');
const puppeteer = require('puppeteer');
module.exports = async function (result, url, id, options) {
const browser = await createBrowser();
const page = await browser.newPage();
const css = await browser.newPage();
await page.goto(`${url}/reports/${id}`, {
waitUntil: 'networkidle2'
});
await css.goto(`${url}/styles.bundle.css`, {
waitUntil: 'networkidle2'
});
await page.waitForSelector('.report-loaded');
let cssBody = await css.evaluate(() => `<style>${document.documentElement.innerHTML}</style>`);
let bodyHtml = await page.evaluate(() => document.documentElement.innerHTML);
bodyHtml = bodyHtml.replace('<link href="styles.bundle.css" rel="stylesheet">', cssBody);
browser.close();
pdf.create(cssBody + bodyHtml, options).toStream((error, stream) => stream.pipe(result.stream));
}
async function createBrowser() {
return await puppeteer.launch({
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
}
貌似产生-pdf.js脚本使用“HTML-PDF”。这可以在NPM发现:https://www.npmjs.com/package/html-pdf
它有一个GitHub的页面:https://github.com/marcbachmann/node-html-pdf
所以,问题将是与包的使用,或者它的某种错误的。 (当然,这是由于我的假设,我不知道这个包在所有和没有经验与它的工作)
在这一点上我会尝试找出正在使用的是包的版本,请查看源代码,并试图找到一个暗示在那里。
这种结构似乎颇为曲折,但。为什么不直接产生在客户端的PDF摆在首位,或者它在C#代码生成?它在某一点的工作和现在一样,你都注意到这被证明是难以维持不应该是一个参数。