"Invalid argument #1 to 'ipairs' (table expected, got nil)

Hi

I have this script (credit: @kercig) to create servers, but when I click the create servers button, I get this error:

Error line:

local function ServerUpdate(ServerId,UserId,Psid)
	local createnewarr = true
	servers = playerData:GetAsync(playerUserId)

	--[[ line -]] for i,v in ipairs(servers) do
		if v.server == ServerId and v.plr ==  UserId then
			createnewarr = false
		end
	end
	local arr = {server = ServerId,plr = UserId,id = nil}
	if Psid then
		for i,v in ipairs(servers) do
			if v.server == ServerId and v.id == nil then
				v.id = Psid
				createnewarr = false
			end
		end
	end
	if Psid == nil then
		for i,v in ipairs(servers) do
			if v.server == ServerId and v.id then
				createnewarr = false
			end
		end
	end
	if createnewarr == true then
		table.insert(servers,arr)
	end
	local success, err = pcall(function()
		local playerUserId = "#ServersData[pcall1]Data"
		playerData:SetAsync(playerUserId,servers)
	end)
	if not success then
		warn('UFF Hub | A datastore error occured: ' .. err)
	elseif success then
		warn('UFF Hub | Data successfully loaded!')
	end		 


end

Full script:

local servers = {}
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("#ServersData[pcall1]Save")
local runService = game:GetService("RunService")
local playerUserId = "#ServersData[pcall1]Data"

local data = playerData:GetAsync(playerUserId) 
if data then
	servers = data
else
	servers = {}
end

game:BindToClose(function()
	task.wait(10)
end)

local arrayofunions = {}


local TS = game:GetService("TeleportService")
local Players = game:GetService("Players")
local messagingService = game:GetService("MessagingService")
local httpService = game:GetService("HttpService")
local rs = game:GetService("ReplicatedStorage")
local asktoinvite = rs.AskToInvite
local tp = rs.TeleportToServer
local newserver = rs.CreateServer
local PrivateServerId = game.PrivateServerId


local CurServerNumber = 0
local isReserved = PrivateServerId ~= "" and PrivateServerId == 0

local function ServerUpdate(ServerId,UserId,Psid)
	local createnewarr = true
	servers = playerData:GetAsync(playerUserId)

	for i,v in ipairs(servers) do
		if v.server == ServerId and v.plr ==  UserId then
			createnewarr = false
		end
	end
	local arr = {server = ServerId,plr = UserId,id = nil}
	if Psid then
		for i,v in ipairs(servers) do
			if v.server == ServerId and v.id == nil then
				v.id = Psid
				createnewarr = false
			end
		end
	end
	if Psid == nil then
		for i,v in ipairs(servers) do
			if v.server == ServerId and v.id then
				createnewarr = false
			end
		end
	end
	if createnewarr == true then
		table.insert(servers,arr)
	end
	local success, err = pcall(function()
		local playerUserId = "#ServersData[pcall1]Data"
		playerData:SetAsync(playerUserId,servers)
	end)
	if not success then
		warn('UFF Hub | A datastore error occured: ' .. err)
	elseif success then
		warn('UFF Hub | Data successfully loaded!')
	end		 


end
Players.PlayerRemoving:Connect(function(player)
	CurServerNumber -= 1
	for i,v in ipairs(servers) do
		if PrivateServerId == v.id and isReserved then
			local messageData = {}

			messageData["sender"] = v.id
			messageData["message"] = CurServerNumber

			local encoded = httpService:JSONEncode(messageData)
			messagingService:PublishAsync("#ServersData[pcall1]Data", encoded)
		end
	end
end)

Players.PlayerAdded:Connect(function(player)
	for i,v in ipairs(servers) do
		if v.plr == player.UserId and isReserved and v.id == nil then
			ServerUpdate(v.server,v.plr,PrivateServerId)
		end
	end
	CurServerNumber += 1
	for i,v in ipairs(servers) do
		if game.PrivateServerId == v.id and isReserved then
			local messageData = {}

			messageData["sender"] = v.id
			messageData["message"] = CurServerNumber

			local encoded = httpService:JSONEncode(messageData)
			messagingService:PublishAsync("#ServersData[pcall1]Data", encoded)
		end
	end
end)

local function addtolist(PrivateServerId,amount,player)
	coroutine.wrap(function()
		local List = player.PlayerGui:WaitForChild("ScreenGui",10).Frame.List
		local StandartFrame = game:GetService("ReplicatedStorage").Frame:Clone()
		StandartFrame.Parent = List
		local Owner = StandartFrame:FindFirstChild("Owner")

		local Players = StandartFrame:FindFirstChild("Players")
		local data
		for i,v in ipairs(servers) do
			if v.id == PrivateServerId then
				data = v
			end
		end
		if data then

			Players.Text = "Players: "..tostring(amount).." / 50"
			Owner.Text = "Owner: ".. Players:GetNameFromUserIdAsync(data.plr)
		end
	end)()
end
function callbackFunction(serviceData)
	local decodedData = httpService:JSONDecode(serviceData.Data)
	arrayofunions[decodedData.sender] = decodedData.message
	if decodedData.message == 0 then
		arrayofunions[decodedData.sender] = nil	
	end

end
messagingService:SubscribeAsync("#ServersData[pcall1]Data", callbackFunction)

newserver.OnServerEvent:Connect(function(plr)
	local bool = false
	for i,v in ipairs(servers) do
		if PrivateServerId == v.id and v.plr == plr.UserId then
			warn("UFF Hub | You have made a server already!")
			bool = true
			break
		end
		if v.plr == plr.UserId and v.id ~= PrivateServerId then
			TS:SetTeleportGui(rs:WaitForChild("TeleportingGui"))
			TS:TeleportToPrivateServer(9619375620,v.server,{plr})
			bool = true
		end
	end
	if bool == false then
		warn("UFF Hub | Creating server...")

		local code = TS:ReserveServer(9619375620) 
		ServerUpdate(code,plr.UserId)
		TS:SetTeleportGui(rs:WaitForChild("TeleportingGui"))
		TS:TeleportToPrivateServer(9619375620,code,{plr})
	end
end)
coroutine.wrap(function()
	while task.wait(10) do
		for i,v in ipairs(servers) do
			if PrivateServerId == v.id and isReserved then
				local messageData = {}

				messageData["sender"] = v.id
				messageData["message"] = CurServerNumber

				local encoded = httpService:JSONEncode(messageData)
				messagingService:PublishAsync("#ServersData[pcall1]Data", encoded)
			end
		end
	end
end)()
coroutine.wrap(function()
	while task.wait(1) do
		for i,plr in ipairs(Players:GetChildren()) do
			coroutine.wrap(function()
				for i,c in ipairs(plr.PlayerGui:WaitForChild("System",10).Frame.List:GetChildren()) do
					if c:IsA("Frame") then
						c:Destroy()
					end
				end
			end)()
		end
		for i,v in ipairs(servers) do
			if v.id ~= nil and arrayofunions[v.id] then

				for i,j in ipairs(Players:GetChildren()) do
					coroutine.wrap(function()
						addtolist(v.id,arrayofunions[v.id],j)
					end)()
				end
			end
		end
	end
end)()

Any help would be appreciated, thanks!

That error happens whenever the table you want to loop through is nil.

I know, I tried everything to fix it, loading data in the table, but it still is nil

Are you sure this is right? This text will be blurred

Yes, it is right. Should I put the players user id instead?

What data is supposed to be in the datastore?

It is meant to be for my private server system, checks if player already has a vip server

In that case you can check if it’s not nil, only then run the loop.

Try this

local function ServerUpdate(ServerId,UserId,Psid)
	local createnewarr = true
	local data = playerData:GetAsync(playerUserId) 
	if data then
	    servers = data
    else
	    servers = {}
    end

	for i,v in ipairs(servers) do
		if v.server == ServerId and v.plr ==  UserId then
			createnewarr = false
		end
	end

I’m pretty sure this can be reduced to servers = data or {}

Thanks, it works but for some reason it doesn’t show others servers

Check console to check if everything is ok and send screenshot pls.

Everything is OK in the console, no errors etc

wait Do you have this script in reserved game?
i mean if it is another game then it won’t work because it doesn’t have this script.
If you have this script in another game then it should work

I have the script in reserved game…