แก้ “attempt to index a nil value” ในสคริปต์ FiveM (ESX, QBCore, xPlayer)
ข้อผิดพลาด Lua นี้หมายความว่าสคริปต์ใช้สิ่งที่ไม่มีอยู่ราวกับว่ามันเป็นตาราง ส่วนในวงเล็บ เช่น global 'ESX' หรือ local 'xPlayer' บอกว่าอะไรหายไป และแต่ละแบบมีวิธีแก้ต่างกัน
อ่านข้อผิดพลาดก่อน
คอนโซลเซิร์ฟเวอร์และคอนโซล F8 แสดงข้อผิดพลาดแบบนี้:
SCRIPT ERROR: @my_script/server/main.lua:12: attempt to index a nil value (global 'ESX')
ชื่อรีซอร์ส ไฟล์ และหมายเลขบรรทัดมาก่อน คุณจึงรู้ว่าต้องดูตรงไหน คำในวงเล็บบอกว่าอะไรเป็น nil:
| ในวงเล็บ | มักหมายถึง |
|---|---|
| global 'ESX' | สคริปต์ไม่เคยได้ออบเจกต์ ESX หรือ ESX ไม่ได้ทำงานตอนสคริปต์เริ่ม |
| global 'QBCore' | เหมือนกันสำหรับ QBCore |
| local 'xPlayer' หรือ 'Player' | เฟรมเวิร์กไม่มีออบเจกต์ผู้เล่นของผู้เล่นคนนั้น |
| field 'Jobs' หรือชื่ออื่น | ตารางมีอยู่แต่คีย์หายไป เพราะข้อมูลหรือไฟล์คอนฟิกไม่ถูกโหลด |
แก้ global 'ESX'
- สตาร์ต ESX ก่อน ใน server.cfg ให้วาง
ensure es_extendedไว้เหนือสคริปต์ทุกตัวที่ใช้มัน และตรวจคอนโซลหาข้อผิดพลาดจาก es_extended เอง ซึ่งต้องมีการเชื่อมต่อฐานข้อมูลจึงจะสตาร์ตได้ - นำเข้า ESX ในสคริปต์ เพิ่มบรรทัดนี้ใน fxmanifest.lua ของสคริปต์:
shared_script '@es_extended/imports.lua'
หรือตั้งค่าออบเจกต์ใน Lua ใกล้ส่วนบนของไฟล์:
ESX = exports["es_extended"]:getSharedObject()
สคริปต์เก่าใช้ TriggerEvent('esx:getSharedObject', ...) อีเวนต์นั้นไม่มีอีกแล้วใน ESX ปัจจุบัน ให้แทนที่ด้วย export ด้านบน
แก้ global 'QBCore'
ประกาศออบเจกต์ที่ส่วนบนของไฟล์ Lua ทุกไฟล์ที่ใช้มัน:
local QBCore = exports['qb-core']:GetCoreObject()
local ในไฟล์หนึ่งมองไม่เห็นในอีกไฟล์ สคริปต์ที่ทำงานใน client/main.lua จึงยังล้มเหลวใน client/events.lua ได้ สตาร์ต qb-core ก่อนสคริปต์ใน server.cfg Qbox มีเลเยอร์ความเข้ากันได้สำหรับสคริปต์ QBCore ส่วนใหญ่ แต่ให้ตรวจว่าสคริปต์รองรับ
แก้ local 'xPlayer'
ESX.GetPlayerFromId(source) และ QBCore.Functions.GetPlayer(source) คืนค่า nil เมื่อผู้เล่นยังไม่ถูกโหลด ออกไปแล้ว หรือ ID ผิด ตรวจผลลัพธ์เสมอก่อนใช้:
local xPlayer = ESX.GetPlayerFromId(source) if not xPlayer then return end
เหตุผลที่พบบ่อยที่ผู้เล่นหายไป:
sourceเป็น 0 เมื่อคำสั่งรันจากคอนโซลเซิร์ฟเวอร์ จึงไม่มีผู้เล่นsourceเปลี่ยนได้หลังWaitคัดลอกไว้ก่อนด้วยlocal src = sourceแล้วใช้srcหลังจากนั้น- อีเวนต์ทำงานตอนที่ผู้เล่นยังเข้าร่วมอยู่ รออีเวนต์ “โหลดผู้เล่นแล้ว” ของเฟรมเวิร์ก คือ
esx:playerLoadedใน ESX และQBCore:Server:PlayerLoadedใน QBCore - ผู้เล่นออฟไลน์ ให้ค้นหาเขาด้วยตัวระบุในฐานข้อมูลแทน
แก้ฟิลด์ที่หายไป
ถ้าตารางมีอยู่แต่คีย์เป็น nil แปลว่าข้อมูลเบื้องหลังไม่ถูกโหลด ตรวจว่าไฟล์คอนฟิกอยู่ใน fxmanifest.lua ก่อนไฟล์ที่ใช้มัน ชื่อสะกดตรงกันทุกที่ และเวอร์ชันสคริปต์ตรงกับเวอร์ชันเฟรมเวิร์กของคุณ เฟรมเวิร์กเปลี่ยนชื่อฟังก์ชันระหว่างเวอร์ชัน และสคริปต์ที่เขียนไว้สำหรับเวอร์ชันเก่าจะพัง
ตรวจพื้นฐาน
- อ่านข้อผิดพลาดแรกในคอนโซล ข้อผิดพลาดหลังจากนั้นมักเป็นผลจากข้อแรก
- ตรวจการตั้งค่าเฟรมเวิร์กของสคริปต์เอง ถ้ามี ในไฟล์คอนฟิกของมัน
- หลังแก้สคริปต์ ให้รัน
restart resource_nameในคอนโซลและดูข้อผิดพลาดใหม่
ยังแก้ไม่ได้?
ถามผู้เขียนสคริปต์พร้อมข้อความข้อผิดพลาดเต็ม ไฟล์และบรรทัด เฟรมเวิร์กและเวอร์ชันของคุณ และลำดับการสตาร์ตจาก server.cfg
โฮสต์เซิร์ฟเวอร์ FiveM ของคุณในสิงคโปร์
ปิงต่ำสำหรับผู้เล่นในอินเดีย มาเลเซีย และอินโดนีเซีย บน AMD EPYC พร้อม NVMe และการป้องกัน DDoS จาก Gcore บนทุก IP
