﻿---
read_when:
    - การตรวจสอบข้อขัดข้องของตัวโหลด tsx/esbuild ที่ระบุว่าขาดตัวช่วย __name
summary: ข้อขัดข้องในอดีตของ Node + tsx ที่แสดงข้อผิดพลาด "__name is not a function" และสาเหตุ
title: Node + tsx ขัดข้อง
x-i18n:
    generated_at: "2026-07-12T16:09:09Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    provider: openai
    source_hash: 97d2f62d24860cee65753027ba84c14c8d4ffb910ee17bb0032cf0409c427589
    source_path: debug/node-issue.md
    workflow: 16
---

# ข้อขัดข้อง Node + tsx ที่แจ้งว่า "\_\_name is not a function"

## สถานะ

แก้ไขแล้ว ข้อขัดข้องนี้ไม่สามารถทำให้เกิดซ้ำได้ใน `tsx` เวอร์ชันปัจจุบันที่ตรึงไว้ใน
`package.json` (`4.22.3`) หรือใน Node รุ่นปัจจุบัน เก็บข้อมูลนี้ไว้เผื่อการอัปเกรด
`tsx`/esbuild ในอนาคตทำให้ปัญหานี้กลับมาอีกครั้ง

## อาการเดิม

การเรียกใช้สคริปต์สำหรับการพัฒนาของ OpenClaw ผ่าน `tsx` ล้มเหลวระหว่างเริ่มต้นระบบ โดยแสดงข้อความดังนี้:

```text
[openclaw] Failed to start CLI: TypeError: __name is not a function
    at createSubsystemLogger (src/logging/subsystem.ts)
    at <caller> (src/agents/auth-profiles/constants.ts)
```

ละเว้นหมายเลขบรรทัดไว้ เนื่องจากไฟล์ทั้งสองมีการเปลี่ยนแปลงหลังจากเกิดข้อขัดข้องเดิม
และบรรทัดที่ระบุในขณะนั้นไม่ตรงกันอีกต่อไป

ปัญหานี้ปรากฏขึ้นหลังจากสคริปต์สำหรับการพัฒนาเปลี่ยนจาก Bun มาใช้ `tsx` (`2871657e`,
2026-01-06) เพื่อให้ Bun เป็นตัวเลือกที่ไม่บังคับ เส้นทางการทำงานเทียบเท่าที่ใช้ Bun
ไม่เกิดข้อขัดข้อง เดิมพบปัญหานี้บน Node v25.3.0 ใน macOS และคาดว่าแพลตฟอร์มอื่น
ที่ใช้ Node 25 ก็น่าจะได้รับผลกระทบเช่นกัน

## สาเหตุ

`tsx` แปลง TS/ESM ผ่าน esbuild โดยกำหนด `keepNames: true` ไว้ตายตัวใน
ตัวเลือกการแปลง การตั้งค่านี้ทำให้ esbuild ห่อการประกาศฟังก์ชัน/คลาสที่มีชื่อ
ด้วยการเรียกตัวช่วย `__name` เพื่อให้ `fn.name` ยังคงอยู่หลังการย่อขนาด
และการรวมชุดโค้ด ข้อขัดข้องนี้หมายความว่าตัวช่วยดังกล่าวหายไปหรือถูกบดบัง
ณ จุดเรียกใช้ของโมดูลนั้นในการใช้ `tsx`/Node รุ่นที่ได้รับผลกระทบ ส่งผลให้
`__name(...)` ส่งข้อผิดพลาดแทนที่จะคืนค่าที่ถูกห่อไว้

## การตรวจสอบการเกิดปัญหาซ้ำในปัจจุบัน

```bash
node --version
pnpm install
node --import tsx src/entry.ts status
```

ตัวอย่างการทำให้เกิดปัญหาซ้ำแบบแยกส่วนขั้นต่ำ (โหลดเฉพาะโมดูลจากสแต็กเทรซเดิม):

```bash
node --import tsx scripts/repro/tsx-name-repro.ts
```

ปัจจุบันทั้งสองคำสั่งสิ้นสุดการทำงานโดยไม่มีข้อผิดพลาด หากคำสั่งใดส่งข้อผิดพลาด
`__name is not a function` อีกครั้ง ให้บันทึกเวอร์ชัน Node ที่แน่นอน เวอร์ชัน `tsx`
(`node_modules/tsx/package.json`) และสแต็กเทรซทั้งหมดก่อนรายงานไปยังโครงการต้นทาง

## วิธีแก้ขัดข้อง (หากปัญหากลับมา)

- เรียกใช้สคริปต์สำหรับการพัฒนาด้วย Bun แทน `node --import tsx`
- เรียกใช้ `pnpm tsgo` เพื่อตรวจสอบชนิดข้อมูล จากนั้นเรียกใช้ผลลัพธ์ที่สร้างแล้ว
  แทนการเรียกใช้ซอร์สโค้ดผ่าน `tsx`:

  ```bash
  pnpm tsgo
  node openclaw.mjs status
  ```

- ลองใช้ `tsx` เวอร์ชันอื่น (`pnpm add -D tsx@<version>` เป็นการเปลี่ยนแปลง
  การพึ่งพาและต้องได้รับอนุมัติตามนโยบายของที่เก็บโค้ด) เพื่อไล่หาว่า esbuild
  เวอร์ชันที่รวมมาด้วยทำให้ข้อบกพร่องนี้กลับมาอีกครั้งหรือไม่
- ทดสอบบน Node รุ่นหลัก/รุ่นย่อยอื่น เพื่อดูว่าความล้มเหลวนี้เกิดเฉพาะกับ
  บางเวอร์ชันหรือไม่

## เอกสารอ้างอิง

- [https://esbuild.github.io/api/#keep-names](https://esbuild.github.io/api/#keep-names)
- [https://github.com/evanw/esbuild/issues/1031](https://github.com/evanw/esbuild/issues/1031)

## เนื้อหาที่เกี่ยวข้อง

- [การติดตั้ง Node.js](/th/install/node)
- [การแก้ไขปัญหา Gateway](/th/gateway/troubleshootin