Ok so, I'm making a mining simulator, and I want to make a tool DataStore. For some reason, the data won't load properly.

Script I used:

local DataStoreService = game:GetService("DataStoreService")
local DS = DataStoreService:GetDataStore("MinerzData")

local function loadData(player)
	local key = player.UserId .. "-minerzData"
	local data
	
	local success,errorMessage = pcall(function()
		data = DS:GetAsync(key)
	end)
	
	if success then
		print('MinerzData | Successfully loaded ' .. player.Name .. "'s data!")
		return data
	elseif errorMessage then
		warn('MinerzData | ' .. errorMessage)
		return nil
	end
end

local function saveData(player)
	local key = player.UserId .. "-minerzData"
	local data = {
		player.Items.Wood.Value,
		player.Items.Stone.Value,
		player.leaderstats.Cash.Value,
		pickaxes = {
			
		}
	}
	
	for i, pickaxe in pairs(player.Backpack:GetChildren()) do
		if pickaxe:IsA("Tool") then
			table.insert(data.pickaxes, pickaxe.Name)
		end
	end
	
	
	
	local success,errorMessage = pcall(function()
		DS:SetAsync(key, data)
	end)
	
	if success then
		print('MinerzData | Successfully saved ' .. player.Name .. "'s data!")
		return
	elseif errorMessage then
		warn('MinerzData | ' .. errorMessage)
		return
	end
end

game.Players.PlayerAdded:Connect(function(player)
	local playerItems = Instance.new("Folder", player)
	playerItems.Name = "Items"
	
	local leaderstats = Instance.new("Folder", player)
	leaderstats.Name = "leaderstats"
	
	local cash = Instance.new("IntValue", leaderstats)
	cash.Name = "Cash"
	cash.Value = 0
	
	for i, item in pairs(game:GetService("ServerStorage"):WaitForChild("Items"):GetChildren()) do
		local newVal = Instance.new("IntValue", playerItems)
		newVal.Name = item.Name
		newVal.Value = 0
	end
	
	local data = loadData(player)
	
	if data == nil then
		warn(player.Name .. " must be a new player; data not found!")
	elseif data then
		playerItems:WaitForChild("Wood").Value = data[1]
		playerItems:WaitForChild("Stone").Value = data[2]
		cash.Value = data[3]
		for i, pickaxe in ipairs(data.pickaxes) do
			local exists = game:GetService("ReplicatedStorage"):WaitForChild("Pickaxes"):FindFirstChild(pickaxe)
			if exists then
				local newPick = exists:Clone()
				local newPick2 = exists:Clone()
				newPick.Parent = player:WaitForChild("Backpack")
				newPick2.Parent = player:WaitForChild("StarterGear")
			end
		end
	end
	
	player.CharacterRemoving:Connect(function(char)
		char:WaitForChild("Humanoid"):UnequipTools()
	end)
end)

game.Players.PlayerRemoving:Connect(function(player)
	saveData(player)
end)



game:BindToClose(function()
	for i, player in pairs(game.Players:GetPlayers()) do
		saveData(player)
	end
end)

On line 78, it errors with:

ServerScriptService.InventoryHandler:79: invalid argument #1 to 'ipairs' (table expected, got nil)

On line 23 I define the "data" table in the saveData() function. I also define "pickaxes" as a sub-table. (line 27) For some reason, when I join the game, it says table expected, got nil. I don't know why this happens, and when I do a print(data.pickaxes), it just prints "nil."

If someone could help, it would mean a lot to me!