Skip to content

服务器启动失败:PYTDX_PY 路径错误 + ibkr ESM 模块解析问题 #94

@zxjack

Description

@zxjack

问题描述

服务器 pnpm devnode dist/main.js 无法正常启动,具体表现为:

  1. tsx src/main.ts 启动后卡住:输出 news-collector-store 加载成功,equity: failed to fetch from sec 警告后,进程挂起不退出也不继续,端口 6901/3002 始终未监听
  2. node dist/main.js 启动直接报错:ESM 模块解析失败

Bug 1:PYTDX_PY 路径不存在(阻断性)

文件: src/domain/market-data/equity/symbol-index.ts 第 23 行

const PYTDX_PY = '/Users/zxjack/tools/pytdx3/.venv/bin/python'  // ❌ 不存在

正确路径应为: /opt/homebrew/bin/python3(或系统中实际可用的 Python 3)

影响: fetchAShareSymbols() 调用 execFileAsync(PYTDX_PY, [BRIDGE], ...) 时 Python 可执行文件找不到,导致:

  • A 股 symbol 无法从本地 pytdx bridge 加载
  • fetchFromApi 所有数据源失败
  • allEntries.length === 0 触发 throw new Error('All sources returned empty')
  • symbolIndex.load() 抛出异常,startup crash

验证:

ls /Users/zxjack/tools/pytdx3/.venv/bin/python  # 不存在
python3 /Users/zxjack/.openclaw/workspace/scripts/pytdx3_bridge.py  # ✅ 可以运行

修复建议:

// 改为系统 Python
const PYTDX_PY = '/opt/homebrew/bin/python3'
// 或使用 which 动态查找
import { execSync } from 'child_process'
const PYTDX_PY = execSync('which python3').toString().trim()

Bug 2:ibkr 包 ESM 目录导入问题(阻断性)

文件: packages/ibkr/src/index.ts 第 36 行

export { Decoder } from './decoder'  // ❌ 目录导入,Node.js ESM 无法解析

问题根因:

  • TypeScript tsc 编译后,dist/decoder/ 生成的是目录(内有 index.js 文件)
  • Node.js ESM 规范下,from './decoder' 不能自动解析为 from './decoder/index.js'
  • 错误:Error [ERR_UNSUPPORTED_DIR_IMPORT]: Directory import '.../decoder' is not supported

同样问题存在于 decoder/index.ts 内部所有导入(basemarket-dataorders 等)也都没有 .js 扩展名。

影响: pnpm build:backend 生成的 dist/main.js 无法作为 ESM 模块加载,node dist/main.js 直接报错退出。

修复建议:

方案 A — 修源码,给所有 ESM 导入加上 .js 后缀:

// packages/ibkr/src/index.ts
export { Decoder } from './decoder/index.js'  // ✅

// packages/ibkr/src/decoder/index.ts
import { Decoder } from './base.js'           // ✅ 所有文件加 .js

方案 B — 修改 packages/ibkr/tsconfig.jsonmoduleResolution

"moduleResolution": "node16"  // 或 "nodenext"

环境信息

  • Node.js: v25.8.0
  • Python: 3.14.3(homebrew)
  • pnpm: 10.x
  • 平台: macOS arm64
  • pytdx3 bridge: /Users/zxjack/.openclaw/workspace/scripts/pytdx3_bridge.py(正常运行)

重现步骤

cd /Users/zxjack/tools/OpenAlice
pnpm dev
# 观察:tsx src/main.ts 启动后卡住,端口 6901/3002 始终未监听

cd /Users/zxjack/tools/OpenAlice
pnpm build
node dist/main.js
# 报错:ERR_UNSUPPORTED_DIR_IMPORT

优先级建议

Bug 优先级 说明
PYTDX_PY 路径 P0 startup 直接 crash
ibkr ESM 导入 P0 无法运行 production build

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions