Spatie Laravel-pdf服务器运行失败:提示npm、node命令未找到
问题分析
部署到服务器后出现如下报错:
The command "PATH=$PATH:/usr/local/bin:/opt/homebrew/bin NODE_PATH=
npm root -gnode '/home/u1666881/public_html/royal_ambarrukmo/api/vendor/spatie/browsershot/src/../bin/browser.cjs' '{"url":"file:///tmp/1028804210-0397463001710232070/index.html","action":"pdf","options":{"args":[],"viewport":{"width":800,"height":600},"displayHeaderFooter":false,"margin":{"top":"2cm","right":"2cm","bottom":"2cm","left":"2cm"},"format":"a4","printBackground":true}}'" failed. Exit Code: 127(Command not found) Working directory: /home/u1666881/public_html/royal_ambarrukmo/api/public Output: ================ Error Output: ================ sh: npm: command not found sh: node: command not found
核心原因:服务器未安装Node.js,或者PHP运行环境无法找到node/npm的执行路径。本地环境正常是因为已安装Node.js且路径配置正确。
使用的生成PDF代码:
return Pdf::view('leave', ['data' =>$leave, 'dp' => $dp, 'eo' => $eo, 'al' => $al, 'staff' => $staff, 'id'=> $id, 'ids' => $ids, 'users' => $users, 'quota' => $quota]) ->format('a4') ->margins(2, 2, 2, 2, Unit::Centimeter) ->name('leave-'.now()->format('Y-m-d').'.pdf');
解决步骤
1. 检查并安装Node.js
登录服务器终端,执行以下命令验证是否安装Node.js:
node -v npm -v
如果没有返回版本号,说明未安装,根据服务器系统选择对应安装方式:
- Ubuntu/Debian:
sudo apt update sudo apt install nodejs npm - CentOS/RHEL:
sudo yum install nodejs npm
安装完成后再次执行node -v和npm -v确认安装成功。
2. 指定Node.js路径给Laravel-pdf
如果已安装Node.js但仍报错,说明PHP进程无法找到node的执行路径。先找到node的实际路径:
which node
得到类似/usr/bin/node的路径后,有两种配置方式:
方式一:修改配置文件
先发布pdf配置文件(未发布过的话执行):
php artisan vendor:publish --provider="Spatie\Pdf\PdfServiceProvider"
打开config/pdf.php,找到browsershot配置项,添加node_binary:
'browsershot' => [ 'node_binary' => '/usr/bin/node', // 替换为你实际的node路径 // 其他原有配置... ],
方式二:在代码中临时指定
在生成PDF的代码中直接设置node路径:
return Pdf::view('leave', ['data' =>$leave, 'dp' => $dp, 'eo' => $eo, 'al' => $al, 'staff' => $staff, 'id'=> $id, 'ids' => $ids, 'users' => $users, 'quota' => $quota]) ->format('a4') ->margins(2, 2, 2, 2, Unit::Centimeter) ->name('leave-'.now()->format('Y-m-d').'.pdf') ->browsershot(function ($browsershot) { $browsershot->setNodeBinary('/usr/bin/node'); // 替换为实际路径 });
3. 安装Browsershot系统依赖
Spatie/pdf依赖Browsershot,而Browsershot需要系统级依赖支持,Ubuntu系统可执行以下命令安装:
sudo apt install libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libpangocairo-1.0-0 libatk1.0-0 libatk-bridge2.0-0 libgtk-3-0
内容的提问来源于stack exchange,提问作者Jumbo Mambo

