为何FiveM脚本客户端回调无法接收正确变量类型?
FiveM脚本获取citizenId时客户端回调数据类型异常问题解决
开发FiveM脚本时遇到以下问题:需要获取玩家的citizenId,服务器事件返回的是字符串(已通过控制台打印验证变量及类型正确),但数据返回至客户端回调函数后变成了object,打印时触发报错:SCRIPT ERROR: error object is not a string。
复现代码
前端触发回调的JS脚本(可正常运行)
文件路径:html/script.js
const createOrg = () =>{ var orgName = document.getElementById("neworg-name-input").value; fetch(`https://${GetParentResourceName()}/orgcreateCb`, { method: 'POST', headers: { 'Content-Type': 'application/json; charset=UTF-8', }, body: JSON.stringify({ organizationName: orgName, }) }).then(resp => resp.json()).then(resp => console.log(resp)); //console.log(orgName); };
服务器事件(可正常运行)
文件路径:server/main.lua
RegisterServerEvent('getPlayerCitizenId') AddEventHandler('getPlayerCitizenId', function(cb) local currentCitizenId = QBCore.Functions.GetPlayer(source).PlayerData.citizenid cb(tostring(currentCitizenId)) end)
异常的客户端回调
文件路径:client/main.lua
RegisterNUICallback("orgcreateCb", function(data, cb) TriggerServerEvent('getPlayerCitizenId', function(citizenId) print('Citizen ID:', citizenId) end) end)
问题原因及解决方案
核心问题
TriggerServerEvent是单向事件发送API,不支持直接传递回调函数接收返回值。你之前传递的回调函数会被当作普通参数发给服务器,导致服务器返回的字符串被错误包裹成对象,最终客户端接收时类型异常。
修正后的代码
服务器端(改用QBCore回调注册)
修改server/main.lua:
RegisterServerCallback('getPlayerCitizenId', function(source, cb) local currentCitizenId = QBCore.Functions.GetPlayer(source).PlayerData.citizenid cb(tostring(currentCitizenId)) end)
客户端(改用TriggerServerCallback)
修改client/main.lua:
RegisterNUICallback("orgcreateCb", function(data, cb) TriggerServerCallback('getPlayerCitizenId', function(citizenId) print('Citizen ID:', citizenId) -- 可选:将结果返回给前端 cb({ status = 'success', citizenId = citizenId }) end) end)
补充说明
TriggerServerCallback是QBCore提供的异步回调机制,专门用于客户端向服务器请求数据并接收返回值,能保证数据类型正确传递。- 客户端的NUICallback必须调用
cb()方法,否则前端的fetch请求会一直处于挂起状态。
内容的提问来源于stack exchange,提问作者Elzardi
相关产品推荐
相关产品推荐

