When users tried to leave a quest via Telegram, they got this error:
Cast to ObjectId failed for value "845713188" (type number) at path "assignedTo" for model "Task"
The removeUserFromQuest() function in taskService.js was receiving a Telegram ID (a number like 845713188) and trying to use it directly to query the Task model's assignedTo field, which expects a MongoDB ObjectId.
- User clicks "Leave Quest" button in Telegram
callbackHandler.jscallsremoveUserFromQuest(ctx.from.id)- passes Telegram IDtaskService.jstried to use this Telegram ID directly inTask.updateMany({ assignedTo: userId })- MongoDB rejected it because
assignedTois a reference to the User model's_id(ObjectId), not a Telegram ID
Before:
export const removeUserFromQuest = async (userId) => {
// Used userId (Telegram ID) directly - WRONG!
await Task.updateMany(
{ assignedTo: userId }, // ❌ userId is Telegram ID, not ObjectId
{ $pull: { assignedTo: userId } }
);
const user = await User.findOne({ telegramId: userId });
// ...
};After:
export const removeUserFromQuest = async (telegramId) => {
// Step 1: Find user by Telegram ID to get MongoDB ObjectId
const user = await User.findOne({ telegramId: telegramId.toString() });
if (!user) {
return false;
}
// Step 2: Use the correct ObjectId for task updates
await Task.updateMany(
{ assignedTo: user._id }, // ✅ Using MongoDB ObjectId
{ $unset: { assignedTo: "" } }
);
// Step 3: Remove user from quest members
await Quest.updateMany(
{ _id: { $in: user.questsIn } },
{ $pull: { members: user._id } }
);
// Step 4: Clear user's quest list
user.questsIn = [];
await user.save();
return true;
};- Renamed parameter from
userIdtotelegramIdfor clarity - Find user first to get their MongoDB
_id(ObjectId) - Use
user._idfor all database queries instead of Telegram ID - Proper cleanup:
- Unassign user from all their tasks
- Remove user from quest member lists
- Clear user's quest associations
Now when a user clicks "Leave Quest" in Telegram:
- ✅ Their tasks are properly unassigned
- ✅ They are removed from quest member lists
- ✅ Their profile is cleaned up
- ✅ No more ObjectId cast errors
src/services/taskService.js- Fixed theremoveUserFromQuest()functionsrc/bot/handlers/callbackHandler.js- Calls the function (no changes needed)
MongoDB models use ObjectIds for references between documents. When working with Telegram integration:
- Telegram IDs are unique identifiers from Telegram (numbers)
- MongoDB ObjectIds are unique identifiers in the database
- Always convert Telegram IDs to MongoDB ObjectIds before querying referenced fields
✅ Fixed and Working!
Users can now successfully leave quests from the Telegram bot without errors.