You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 10调度器在VPS运行NodeJS进程失败,手动执行正常

问题原因

crontab的执行环境与手动登录终端的环境存在差异,它不会自动加载用户的shell配置文件(如.bashrc、.profile),导致Laravel调度器执行时调用的Node版本并非你安装的18.16.1,而是系统默认的旧版本(通常为Node 12或更低)。旧版本Node不支持??空值合并运算符,而jsdom@22.1.0的代码中使用了该语法,因此触发语法错误。

解决办法

1. 使用Node命令的绝对路径

在手动登录的终端中执行which node,获取Node的绝对路径(例如/usr/local/bin/node或~/.nvm/versions/node/v18.16.1/bin/node)。

修改Laravel调度器中执行的Node命令,将node替换为上述绝对路径,例如原命令为node storage/parsers/parser_1/parser_source.js,修改为:

/usr/local/bin/node storage/parsers/parser_1/parser_source.js

2. 在crontab中加载用户环境变量

若不想每次都指定绝对路径,可修改crontab任务配置,在执行Laravel调度命令前加载用户的shell配置文件,确保环境变量被正确读取:

* * * * * root source /root/.bashrc && cd /var/www/stage.betvia.sk/public_html/ && /usr/bin/php artisan schedule:run >> /var/www/stage.betvia.sk/logs/checkscheduler.txt 2>&1

注意:需将/root/.bashrc替换为实际的用户配置文件路径(比如普通用户可能是/home/your_user/.bashrc)。

3. 验证调度器中的Node版本

在Laravel调度任务中添加测试代码,确认调度器使用的Node版本:

use Illuminate\Support\Facades\Process;
use Illuminate\Support\Facades\Log;

// 测试代码
Process::run('node -v', function ($type, $output) {
    Log::info('Scheduler Node Version: ' . trim($output));
});

运行后查看日志,确认输出版本为18.16.1。

额外检查项
  • 确认node_modules目录权限:确保Laravel调度器的执行用户(root)对node_modules拥有读取权限,避免因权限问题导致依赖加载失败。
  • 核对jsdom版本要求:jsdom@22.x明确要求Node.js >=16.17.0,你的18.16.1版本符合要求,无需调整依赖版本。

内容的提问来源于stack exchange,提问作者Paulis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:33:31