I'm trying to build a game and I'm having a hard time figuring out why my userInfo.create isn't working. Basically, I have it set up to where a user logs in and it sends off a get request to get their profile info. If none exists, create it. I've kind of had to do this in 2 parts. The first is a pretty basic profile info with name, email, id, etc and it works just fine. The problem is in the second request which fires off after the first because it depends on the userId to check if they have a profile. For some reason, it just doesn't want to create the info. It's all built from a Mongoose schema. Everything seems to be the same as the basic profile information. As for the schema itself, all I'm trying to pass in is the userId. Everything else is set to required: true AND has default values set up already. I'm kind of at a loss as to what else it could possibly need.
Broken getUserInfo:
async getUserInfo(id) {
let info = await dbContext.UserInfo.findOne({
_id: id
})
if (info == null) {
// let obj = UserInfo
let obj = {}
obj.userId = id
let newUserInfo = await dbContext.UserInfo.create(obj)
return newUserInfo
} else { return info }
Working getProfile:
async getProfile(user) {
let profile = await dbContext.Profile.findOne({
email: user.email
});
profile = await createProfileIfNeeded(profile, user);
await mergeSubsIfNeeded(profile, user);
return profile;
}
Schema:
import mongoose from "mongoose";
const Schema = mongoose.Schema;
const UserInfo = new Schema(
{
userId: { type: String, required: true, unique: true },
resources: {
gold: { type: Number, required: true, default: 0 },
food: { type: Number, required: true, default: 0 },
ore: { type: Number, required: true, default: 0 },
wood: { type: Number, required: true, default: 0 }
},
upgrades: {
arrows: {
name: { type: String, required: true, defualt: "StoneArrow" },
count: { type: Number, required: true, default: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
ore: { type: Number, required: true, default: 50 },
wood: { type: Number, required: true, defualt: 100 }
},
nameArr: ["StoneArrow", "BronzeArrow", "IronArrow", "SteelArrow", "DiamondArrow"]
},
axes: {
name: { type: String, required: true, defualt: "StoneAxe" },
count: { type: Number, required: true, default: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
ore: { type: Number, required: true, default: 50 },
wood: { type: Number, required: true, defualt: 100 }
},
nameArr: ["StoneAxe", "BronzeAxe", "IronAxe", "SteelAxe", "DiamondAxe"]
},
picks: {
name: { type: String, required: true, defualt: "StonePick" },
count: { type: Number, required: true, default: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
ore: { type: Number, required: true, default: 50 },
wood: { type: Number, required: true, defualt: 100 }
},
nameArr: ["StonePick", "BronzePick", "IronPick", "SteelPick", "DiamondPick"]
},
},
buildings: {
blacksmithShop: {
count: { type: Number, required: true, defualt: 1 },
cost: {
gold: { type: Number, required: true, default: 1000 },
ore: { type: Number, required: true, default: 1200 },
wood: { type: Number, required: true, default: 1500 }
}
},
tavern: {
count: { type: Number, required: true, defualt: 1 },
cost: {
gold: { type: Number, required: true, default: 1000 },
ore: { type: Number, required: true, default: 1200 },
wood: { type: Number, required: true, default: 1500 }
}
}
},
hires: {
hunter: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
},
miner: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
},
lumberjack: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
},
trader: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
},
builder: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
},
blacksmith: {
count: { type: Number, required: true, defualt: 0 },
cost: {
gold: { type: Number, required: true, default: 200 },
food: { type: Number, required: true, default: 1000 },
}
}
}
},
// { timestamps: true, toJSON: { virtuals: true } }
)
export default UserInfo
I can provide more info if needed and as always, any feedback is much appreciated. Thanks!
I'm not entirely sure why, but I had to alias out the .create to a different function and it seems to be working now.