首页 > 解决方案 > 生成 PDF 时 Laravel/Angular-POST 500(内部服务器错误)

问题描述

我有一个 Laravel/Angular 应用程序,在其中一个页面上,用户可以选择将有关单个/选择的事务的数据导出到 PDF 文件。

当前生成的 PDF 显示 3 页(第一个页面用于每个实际交易,随后的页面显示有关这些交易所属帐户的更多信息)。

我想为这个特性添加一些功能,这样如果被导出的交易只有一个存款日期,当它的状态是“请求”时,那么实际上应该只生成当前生成的 PDF 的第一页(应该抑制通常生成的 PDF 的其余部分)。

if在 Blade.php 文件中添加了一条语句,它显示了 PDF 的内容,如下所示:

@if(($transaction->count($transaction['transactionItem']) == 1) && ($transaction['transactionItem']['currentStatusId'] == '1010'))
    <body ... >
        // Content of first page of PDF here
    </body>
@else
    <body ... >
        // Original content of full PDF here
    </body>
@endif

在 HTML 中,带有调用下载 PDF 函数的链接的菜单项是这样写的:

<td class="provActionsCell contactAddressCell text-center table__priority-column" id="reduceWidth-doublePlus" dropdown>
    <a href class="icon icon-kog" dropdownToggle></a>
    <ul class="dropdown-menu" aria-labelledby="angular-simple-dropdown">
        ...
        <li *ngIf="payer.provStatusTag !== 'NA'" (click)="exportSingleTransactionToPDF(payer)"><a href="">Download PDF</a></li>
    </ul>
</td>

exportSingleTransactionToPDF()函数写在临时提醒.ts 中:

exportSingleTransactionToPDF(payer) {
    let requestData = (<any>Object).assign({});
    console.log("requestData: ", requestData);
    payer.loading = true;
    requestData['transactionItem'] = payer;
    console.log("requestData['transactionItem']: ", requestData['transactionItem']);

    this.provService.generateSingleTransactionPDF(requestData).subscribe(
        (data:any) => {
            payer.loading = false;
            this.showPrintDialog = false;
        },
        (error:any) => {
            const message = new Message();
            message.type = MessageType.ERROR;
            message.message = error.message || 'There was a problem generating the PDF.';
            this.messagingService.emitMessage(message);

            payer.loading = false;
        }
    );

    return false;
}

它调用的generateSingleTransactionPDF()函数定义prov.service.ts为:

generateSingleTransactionPDF(data: any): Observable<any> {
    const requestOptions = new RequestOptions({ headers: this.pdfHeaders, responseType: ResponseContentType.Blob });
    console.log("requestOptions: ", requestOptions);
    console.log("data: ", data);

    return this.http
        .post(this.generateSingleTransactionPDFUrl, data, requestOptions)
        .map((res: Response) => {
            const blob = <Blob>res.blob();
            FileSaver.saveAs(blob, `provisional-tax-reminder.pdf`);
        })
        .catch(this.handleError);
}

目前,当我尝试下载 PDF 时,我可以看到我添加的一些调试显示在控制台中,表明正在调用这些函数,然后我在浏览器中看到一个错误横幅,上面写着:

生成 PDF 时出现问题

这显然来自exportSingleTransactionToPDF()函数,因为这是项目中唯一出现此错误消息的地方。generateSingleTransactionPDF()当对函数调用的调用返回错误时,会引发此错误,很明显,return语句generateSingleTransactionPDF()以某种方式返回错误,但我不确定如何/为什么,或者我将如何调试该错误是什么,以及导致它的原因...?

语句generateSingleTransactionPDFUrl()内部调用的函数在 prov.service.ts 文件的开头定义:return.post()

private generateSingleTransactionPDFUrl: string = BASE_URL + '/web-api/t/prov/pdf';

浏览器控制台中显示一个错误,它说:

POST http://... 500(内部服务器错误)

无法解析的响应

这似乎表明该错误是因为 HTTP 请求的响应是不可解析的,但我无法弄清楚为什么会这样......console.log()generateSingleTransactionPDF()在 prov.service.ts 中的函数内放置的语句显示requestOptions&data控制台中的变量-它们似乎保存了正确的数据...所以我不确定为什么说响应无法解析-有人有什么想法吗?

编辑

因此,查看日志文件后,我似乎有一个错误:

下一个 ErrorException:未定义变量:/../views/419cdd3906d761bc1bb55581502a15d04c1fe7a7.php:9 中的事务(视图:/.../reminder.blade.php)

这似乎是在抱怨if我在 Blade.php 文件开头放置的内容:

@if(($transaction->count($transaction['transactionItem']) == 1) && ($transaction['transactionItem']['currentStatusId'] == '1010'))

我将/应该如何$transaction从 Blade.php 文件中访问此变量?

标签: phpangularlaravelposthttpresponse

解决方案


推荐阅读