Cant get player job getting nil

i am trying to get the players job and on first load i am getting
attempt to index a nil value (field 'job')

if i restart the script while in game the error does not show and the script runs fine. anyone know how to fix this?

ESX              = nil
local PlayerData = {}
Citizen.CreateThread(function()
	while ESX == nil do
		TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
		Citizen.Wait(0)
	end
	-- if ESX.PlayerData.job.name == 'bmdealer' then
	-- 	canUse = true
	-- 	print("canUse craftingN set to true")
	-- else
	-- 	print("canUse craftingN set to false")
	-- end
end)
--- other code here

RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
  PlayerData = xPlayer  
  if ESX.PlayerData.job.name == 'bmdealer' then
		canUse = true
		print("canUse craftingN set to true")
	else
		print("canUse craftingN set to false")
	end 
end)

First, this is ESX related.
Then, the event you’re receiving is sended here: https://github.com/ESX-Org/es_extended/blob/fb1c8a0bf12ab9c9cdc76a2be81bcf19d2f8e2bd/server/main.lua#L226
You clearly can see that your event handler does receive the job on the xPlayer “object”.

You do have an issue, but it’s not located here in the script.
It obviously is in the other code here part.

the code is below. This is modifying hyrp9boost. i have added a new item and making it craft into the nitros. i am making it so only the bmdealer job can do the crafting. Thanks for any help Izio.

local Keys = {
	["ESC"] = 322, ["F1"] = 288, ["F2"] = 289, ["F3"] = 170, ["F5"] = 166, ["F6"] = 167, ["F7"] = 168, ["F8"] = 169, ["F9"] = 56, ["F10"] = 57,
	["~"] = 243, ["1"] = 157, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["-"] = 84, ["="] = 83, ["BACKSPACE"] = 177,
	["TAB"] = 37, ["Q"] = 44, ["W"] = 32, ["E"] = 38, ["R"] = 45, ["T"] = 245, ["Y"] = 246, ["U"] = 303, ["P"] = 199, ["["] = 39, ["]"] = 40, ["ENTER"] = 18,
	["CAPS"] = 137, ["A"] = 34, ["S"] = 8, ["D"] = 9, ["F"] = 23, ["G"] = 47, ["H"] = 74, ["K"] = 311, ["L"] = 182,
	["LEFTSHIFT"] = 21, ["Z"] = 20, ["X"] = 73, ["C"] = 26, ["V"] = 0, ["B"] = 29, ["N"] = 249, ["M"] = 244, [","] = 82, ["."] = 81,
	["LEFTCTRL"] = 36, ["LEFTALT"] = 19, ["SPACE"] = 22, ["RIGHTCTRL"] = 70,
	["HOME"] = 213, ["PAGEUP"] = 10, ["PAGEDOWN"] = 11, ["DELETE"] = 178,
	["LEFT"] = 174, ["RIGHT"] = 175, ["TOP"] = 27, ["DOWN"] = 173,
	["NENTER"] = 201, ["N4"] = 108, ["N5"] = 60, ["N6"] = 107, ["N+"] = 96, ["N-"] = 97, ["N7"] = 117, ["N8"] = 61, ["N9"] = 118
}
ESX              = nil
local PlayerData = {}
local nitroActivado = false
local canUse = false

Citizen.CreateThread(function()
	while ESX == nil do
		TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
		Citizen.Wait(0)
	end
	-- if ESX.PlayerData.job.name == 'bmdealer' then
	-- 	canUse = true
	-- 	print("canUse craftingN set to true")
	-- else
	-- 	print("canUse craftingN set to false")
	-- end
end)

RegisterNetEvent('esx:playerLoaded')
AddEventHandler('esx:playerLoaded', function(xPlayer)
  PlayerData = xPlayer  
  Citizen.Wait(10000)
  if ESX.PlayerData.job.name == 'bmdealer' then
		canUse = true
		print("canUse craftingN set to true")
	else
		print("canUse craftingN set to false")
	end 
end)

RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job)
  PlayerData.job = job
end)

Citizen.CreateThread(function()
    while true do

        Citizen.Wait(0)
		local force = 80.0 -- was 80
        	local ped = GetPlayerPed(-1)
		local playerVeh = GetVehiclePedIsIn(ped, false)
	
		if IsControlPressed(1, 47) and nitroActivado then
			--Citizen.Wait(3000)
			SetVehicleBoostActive(playerVeh, 1, 0)
			SetVehicleForwardSpeed(playerVeh, force)
			StartScreenEffect("RaceTurbo", 0, 0)
			SetVehicleBoostActive(playerVeh, 0, 0)
			nitroActivado = false
        end
    end
end)

RegisterNetEvent('hypr9speed:activar')
AddEventHandler('hypr9speed:activar', function()
        TriggerServerEvent('hypr9speed:removeInventoryItem','nitro', 1)
        if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then
            ESX.UI.Menu.Close('default', 'es_extended', 'inventory')
        end

        if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory_item') then
            ESX.UI.Menu.Close('default', 'es_extended', 'inventory_item')
        end
        activarNitro()
end)

RegisterNetEvent('esx:setJob')
AddEventHandler('esx:setJob', function(job)
	PlayerData.job = job
	
	Citizen.Wait(5000)
	TriggerServerEvent('esx_policejob:forceBlip')
end)

RegisterNetEvent('hypr9speed:can')
AddEventHandler('hypr9speed:can', function()
    local plyCoords = GetEntityCoords(PlayerPedId())
    local dstCheck = GetDistanceBetweenCoords(plyCoords,-794.37, -2633.06, 13.85, true)
    if  dstCheck <= 5.0 then
    	if canUse == true then
	        TriggerServerEvent('hypr9speed:removeInventoryItem','canister', 1)
	        if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory') then
	            ESX.UI.Menu.Close('default', 'es_extended', 'inventory')
	        end

	        if ESX.UI.Menu.IsOpen('default', 'es_extended', 'inventory_item') then
	            ESX.UI.Menu.Close('default', 'es_extended', 'inventory_item')
	        end
	        ----------- PROGRESSBAR ----------------------

			TriggerEvent("mythic_progbar:client:progress", {
			        name = "Crafting_NOS",
			        duration = 15000,
			        label = "Crafting NOS",
			        useWhileDead = false,
			        canCancel = true,
			        controlDisables = {
			            disableMovement = false,
			            disableCarMovement = false,
			            disableMouse = false,
			            disableCombat = false,
			        },
			    }, function(status)
			        if not status then
			            -- Do Something If Event Wasn't Cancelled
			        end
			    end)

	        -----------------------------------------------
	       -- Citizen.Wait(15000)
	        TriggerServerEvent('hypr9speed:addnitro','nitro', 1)
	    end
    else
   	print("aww crap")
    end
end)

function activarNitro()
    nitroActivado = true
end

should be canUse.

Non sense?

Should be PlayerData.job.name