I have two separate datastore scripts. The gold (numbers) script works fine, but the weapon (strings) script doesn't.

--the gold script is just this but replace club and weapon lines with gold
local DSS = game:GetService("DataStoreService")

local datastore = DSS:GetDataStore("GeneralSaveData", "Players")

function generateDataKey(player)
    local ret = "uid_" .. player.userId
    return ret
end

function generateDataTable(player)
local dataTable = {
        weapon = player.weapons.Weapon.Value,--both in a model called 'weapons' which is in the player
		club = player.weapons.Club.Value
    }
    return dataTable
end

function saveDataForPlayer(player)
    local key = generateDataKey(player)
    local data = generateDataTable(player)
    datastore:SetAsync(key, data)
end

function inputDataToPlayer(player, data)
if data then
player.weapons.Weapon.Value = data.weapon--it says "Workspace.SaveWep:26: bad argument #3 to 'Value' (string expected, got nil)"
player.weapons.Club.Value = data.club
local ss = game.ServerStorage.Weapons
ss:FindFirstChild(player.weapons.Weapon.Value):Clone().Parent = player.Backpack
ss:FindFirstChild(player.weapons.Weapon.Value):Clone().Parent = player.StarterGear
end
end

function loadDataForPlayer(player)
    local key = generateDataKey(player)
    local data = datastore:GetAsync(key)
    inputDataToPlayer(player, data)
end

game.Players.PlayerAdded:Connect(function(player)
    loadDataForPlayer(player)
    end)

game.Players.PlayerRemoving:Connect(saveDataForPlayer) 

The values are all valid, too. What did I do wrong?